2011-05-10 74 views
11

我正在搞動態屬性,我發現我不能使用__dict__屬性,如果我直接從對象()類創建對象,但如果我創建一個新類,它是對象的直接後代,我可以訪問__dict__屬性。爲什麼區別?在對象()和類myClass(對象)之間的__dict__ Python中的差異

實例:

# This gives an AttributeError 
o = object() 
o.__dict__ 
# This works: prints {} 
class myClass(object): 
    pass 
o = myClass() 
o.__dict__ 
+0

直接用'__dict__'擺弄幾乎總是不需要的,也是一個壞主意。動態屬性名稱通常可以更好地作爲字典鍵來完成,但在少數情況下是合理的 - 但在這些情況下您可以使用'setattr'。 – delnan 2011-05-10 18:37:41

回答

8

object是用C語言實現,並且不具有__dict__屬性。 (並非所有的Python對象都有;查找__slots__)。

+0

@Jamie注意你不能在通過'object()'獲得的實例上分配隨機屬性,而你可以使用'myClass'的實例。事實上,對於不是任何其他類的實例的'object'實例,你可以做很多事情。 – Ben 2012-03-29 03:20:04

1

我不完全確定它爲什麼適用於你的班級,但不是原來的object班。我假設當你的類被初始化時,它會創建__dict__。

使用此代碼:

class Test(object): 
    def __init__(self): 
     pass 

def main(): 
    print 'OBJECT:', dir(object()) 
    print 
    print 'TEST:', dir(Test()) 
    return 

想出了這樣的輸出:

OBJECT: ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__'] 

TEST: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__'] 

正如你所看到的,__dict__,__module__和__weakref__都在測試對象,但不是基本對象

+2

它是Python的一個固有部分 - 無論它們是否要提供__dict__屬性,它都取決於類定義(將它留出可以爲每個實例節省一定的空間)。由於__dict__默認情況下包含在實例中,因此您必須在類定義時專門採取措施來避免提供一個。 – ncoghlan 2011-05-11 03:16:44

相關問題