我无法理解对象实例和对象继承实例之间的区别:
1。__dict__
,__module__
,__weakref__
- 此属性来自哪里?
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> dir(type('tt',(object,),{}))
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
2.我无法将对象设置为对象实例。
>>> b= object()
>>> b.f = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'f'
>>> b = type('tt',(object,),{})()
>>> b.f = 4
这种差异是否来自内置类型构建器?为什么呢?
答案 0 :(得分:1)
1
__dict__
是每个python对象拥有的字典,用于存储它的变量,例如。 foo.x
将查找foo.__dict__['x']
(某些类使用__slots__
代替以节省空间)
__module__
指的是该类的模块。
>>> object.__module__
'__builtin__' # object is part of the builtin module
__weakref__
是对象的引用,weakref
模块使用它来保持对对象的引用,而不会影响引用计数垃圾回收系统。有关它的用途,请参阅here。
2
您无法在object()
个实例上设置属性,因为它没有__dict__
,
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
它仅用作每个其他类的基类,不需要一个。
实际使用type
创建了object
的子类,您也为它的属性赋予了{}
,因此当然b.f = 4
可以使用。
答案 1 :(得分:1)
首先,某些类型是不可变的。例如,int
和tuple
是不可变的,因此是一个普通的object
实例。同样的限制不适用于子类;您可以将int
子类化并赋予其可变属性,这同样适用于object
。
类构建器(__dict__
)将type()
属性添加到自定义类中;它是类的名称空间映射;类上的属性查找被转换为该结构中的键查找。另一方面,object
是Python C类型,C中的属性和方法的处理方式不同。 Python C类型应该实现C Type interface。对于某些类型.__dict__
可以取消引用,但您会发现它是一个只读代理对象,而不能像自定义类型那样动态更改C类型。
__module__
和object
上的int
属性可用:
>>> object.__module__
'builtins'
>>> int.__module__
'builtins'
但由于这些是内置类型,因此该属性确实没有意义,并且未在dir()
中列出。
__weakref__
属性是weakref
module的实现细节。如果在类上没有设置__slots__
attribute,则__dict__
构造函数与type()
属性一起在自定义类上设置此属性。与__dict__
属性一样,您发现自定义类和C类对象之间存在另一个差异。对于Python C类型,C type object structure中的不同条目填充相同的角色。