【问题标题】:Types and classes in PythonPython 中的类型和类
【发布时间】:2011-05-27 15:51:25
【问题描述】:

我对 Python 中的类型和类有点困惑。例如以下 REPL 对话让我感到困惑:

>>> class A: pass
... 
>>> a = A()
>>> type(a)
<type 'instance'>
>>> a.__class__
<class __main__.A at 0xb770756c>
>>> type([])
<type 'list'>
>>> [].__class__
<type 'list'>
>>> type(list)
<type 'type'>
>>> list.__class__
<type 'type'>
>>> type(A)
<type 'classobj'>
>>> A.__class__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute '__class__'
  1. 为什么内置事物的类型和类(例如此处列出)相同但用户类/类型不同?
  2. 不是每个类都是其他类的实例吗(如 Java 中的 Class)?为什么用户定义的类没有__class__?

任何可以澄清这种行为的解释/进一步阅读将不胜感激。 TIA。

【问题讨论】:

  • 你应该用class A(object)定义你的类。然后你会得到&lt;class '__main__.A'&gt; for type(a)。

标签: python class types


【解决方案1】:

在 Python 3.0 中,用户定义的类对象是名为 type 的对象的实例, 这本身就是一个类。 • 在Python 2.6 中,新式类继承自object,它是type 的子类。 • 经典类是类型的实例,不是从类创建的。

【讨论】:

    【解决方案2】:

    您会遇到新样式类与经典类的不同行为。如需进一步阅读,请阅读:Python Data Model。专门阅读关于类的部分以及新样式和经典类之间的区别。

    尝试在您的 REPL 中输入以下内容:

    class A: pass
    class B(object): pass
    

    你会看到你得到不同的结果。在这里,您正在处理新样式类和旧样式类之间的区别。使用 Python 2.6.1 这就是我得到的:

    > type(A)
    <type "classobj">
    > type(B)
    <type "type">
    

    它告诉您列表是新样式类而不是旧样式类。我们还可以使用list 进一步玩弄事物:

    > type(list)
    <type "type">
    

    与我们的 class B(object): pass 结果相同。还有

    > c = []
    > type(c)
    <type "list">
    

    它告诉你对象的实例而不是它的定义。

    【讨论】:

    • 看来我的错误在于没有使用新的类型类,这最终给了我奇怪的结果(肯定是为了向后兼容)。该链接看起来很有趣。谢谢。
    【解决方案3】:

    这是“历史原因”。或可能的“历史”。这一切都在 Python 3 中修复了:

    >>> class A: pass
    ... 
    >>> a = A()
    >>> type(a)
    <class '__main__.A'>
    >>> a.__class__
    <class '__main__.A'>
    >>> type([])
    <class 'list'>
    >>> [].__class__
    <class 'list'>
    >>> type(list)
    <class 'type'>
    >>> list.__class__
    <class 'type'>
    >>> type(A)
    <class 'type'>
    >>> A.__class__
    <class 'type'>
    >>> class B(object): pass
    ... 
    >>> type(B)
    <class 'type'>
    >>> b = B()
    >>> type(b)
    <class '__main__.B'>
    

    【讨论】:

    • 很高兴知道。没有意识到 Python 3 已经一起解决了这个问题。那么,我假设所有类,无论是否明确派生自 object 派生自 object 那么?
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2015-08-14
    • 2021-01-12
    • 2022-10-02
    • 2019-12-27
    • 2018-01-21
    • 2021-06-06
    • 2016-06-27
    相关资源
    最近更新 更多