Python中的`type()`、`__class__`和`__bases__`有什么区别?

3

我在Python的REPL中尝试了这个:

>>> class Foo:
...  def f():{}
... 
>>> 
>>> type(Foo)
<type 'classobj'>
>>> Foo.__bases__
()
>>> type(type(Foo))
<type 'type'>
>>> type(Foo).__bases__
(<type 'object'>,)

然而,我仍然不确定在面向对象编程中,“数据类型”确切地指的是什么。
在Python中,我知道一个实例可以通过“.__class__”获得其类,而一个类可以通过“.__bases__”获得其父类。这似乎很容易理解。
但是,“类”的“类型”或“TypeObject”的“类型”意味着什么?“Type Object”的“type”又意味着什么?“Type Object”的“__bases__”又意味着什么?在Python中,“type”和“class”的区别是什么?
这对我来说看起来有点混乱.. 有人对此有什么想法吗?

1
您的代码标签为python-3.x,但它看起来像是python-2.x - 在Python 3+中,type(Foo)返回 <type' type'> - Holt
这与本问题不直接相关,但值得了解 https://dev59.com/bXI_5IYBdhLWcg3wDOhC - Aashish P
2个回答

2
理解Python的关键在于认识到Python中的所有内容都是对象。此外,技术上来说,“object”不是一个关键字,而是一个全局内置对象。
这篇答案可能是我见过的最好的解释,我强烈建议阅读整篇文章。它谈到了很多关于元类的内容,“type”与元类非常紧密相关。
本质上,一个类的类型是一个元类。所有新式类都继承自“object”,所有元类都继承自“type”。这有点令人困惑,因为在Python中,“type”这个全局对象用于两个不同的目的。它既是一个元类,也是一个返回对象类型的函数。
可以将元类看作创建类的工具,就像类创建实例一样简单。

0
在Python中,类是对象,也就是说,类是“像其他任何东西一样的东西”。以你的例子为例,
class Foo():
    pass

x = Foo()

type(x)                     # Foo, x is a Foo
type(Foo)                   # type, Foo is a type

Foo是你定义的一个类,它不仅仅是一段代码。它是一个占据内存空间的对象。

Foo == 1                    # Valid comparisson which evaluates to False
Bar = Foo                   # Assign new variable bar as Foo

是有效的操作。

>>> type(type(Foo))
<type 'type'>

类型是一种特殊的类(元类),它的对象是可以创建对象的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接