2013-03-22 52 views
1

我無法理解的對象實例和對象繼承實例之間的區別:對象及其繼承

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.我不能將propetry設置爲對象實例。

>>> 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 

這種差異是否來自內建式生成器?爲什麼?

回答

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

首先,一些類型是不可變的。例如,inttuple是不可變的,因此是普通的object實例。同樣的限制不適用於子類;你可以繼承int並賦予它可變屬性,這同樣適用於object

__dict__屬性由類構建器(type())添加到自定義類中;它是該類的名稱空間映射;在類中的屬性查找被轉換爲該結構中的鍵查找。另一方面,object是Python C類型,C中的屬性和方法處理方式不同。預計Python C類型將實現C Type interface。對於某些類型,可以取消引用.__dict__,但是您會發現它是隻讀代理對象,因爲C類型不能像自定義類型那樣動態更改。

__module__屬性提供objectint

>>> object.__module__ 
'builtins' 
>>> int.__module__ 
'builtins' 

但由於這些內置類型的屬性是沒有意義真的,而不是在dir()上市。

__weakref__屬性是weakref module的實施細節。如果沒有在該類上設置__slots__ attribute,則與__dict__屬性一起,type()構造函數在自定義類上設置此屬性。像__dict__屬性一樣,您發現自定義類和C類對象之間存在另一個區別。對於Python C類型,C type object structure中的不同條目填充相同的角色。