对象及其继承

时间:2013-03-22 10:05:03

标签: python python-2.7

我无法理解对象实例和对象继承实例之间的区别:

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

这种差异是否来自内置类型构建器?为什么呢?

2 个答案:

答案 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)

首先,某些类型是不可变的。例如,inttuple是不可变的,因此是一个普通的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中的不同条目填充相同的角色。