我试图在空闲状态下深入了解Python自定义类以及它们如何存储在内存中。假设我有以下代码:
class Point:
pass
x=Point()
print(x)
给出以下输出:
<__main__.Point object at 0x000002A3A071DF60>
我知道,由于我的类不包含任何代码,因此当我创建 Point
类型的对象时,类型为 object
的对象隐式创建 Point
对象x
继承诸如__str__
之类的方法等等。但是,我似乎看不到联系。当我输入dir(x)
时,我没有看到任何存储对 object
类型的对象的引用的属性。 。我是否误解了它的工作原理,或者是否有一些我不知道的属性?
最佳答案
不涉及object
类型的(直接)实例。当您调用 Point()
时,会创建一个 Point
实例,而不会创建其他任何东西。继承是一种在类上运行的机制,而不是在实例上运行。
Python 对象有两个属性:它们的类型和它们的值。 x
的类型是Point
。 x
的 值 由其 __dict__
表示,它为空(因为它没有属性):
>>> type(x)
<class '__main__.Point'>
>>> x.__dict__
{}
没有对object
实例的引用,因为不存在这样的实例。 object
的继承体现在 class Point
中:
>>> Point.__base__
<class 'object'>
>>> Point.mro()
[<class '__main__.Point'>, <class 'object'>]
所以x
之所以可以使用object
方法是因为Point
继承自object
,而不是因为有存储在 x
中的隐藏object
实例。您可以看到 Point
可以访问所有 object
方法:
>>> Point.__str__ is object.__str__
True
>>> Point.__init__ is object.__init__
True
# etc...
因此,通过代理,x
也可以访问所有对象
方法。
关于Python:显示类型继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52941638/