2014-01-10 186 views
0

我的代碼:怪異的行爲

>>> class Class1: 
    pass 

>>> obj1=Class1() 
>>> obj2=Class1() 
>>> obj1.x1=123 
>>> obj2.x2=456 

然後我得到了以下錯誤:

>>> obj1.x2 

Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    obj1.x2 
AttributeError: Class1 instance has no attribute 'x2' 

而且類似:

>>> obj2.x1 

Traceback (most recent call last): 
    File "<pyshell#11>", line 1, in <module> 
    obj2.x1 
AttributeError: Class1 instance has no attribute 'x1' 

的AttributeError的相當奇怪,爲什麼它說Class1沒有屬性'x1'和'x2'? Python聲稱能夠即時添加字段。和我期待的結果是這樣的:

obj1.x2 = None 
obj2.x1 = None 

什麼領域之間的差異加上在飛行和包含在類的定義?

+1

到底是什麼''obj1''和''obj2''? –

+0

你的例子中缺少'obj1 = Class1()'? –

+0

對不起,這是我的代碼。我錯過了我的問題。更新。 – smwikipedia

回答

3

如果obj1Class1的實例,那麼它將在基於實例的級別上添加變量。

這可以被看作是下面

class Test(object): pass 
a = Test() 
b = Test() 
a.a = 4 
print a.a 
print b.a # Attribute error here. 

如果你的意思是添加一個類級別的變量,應用此Test直接

Test.a = 432 
print b.a 
print a.a 
+0

因此,類級別和實例級別的變量有所不同。這與傳統的OOP思維完全不同。 – smwikipedia

+0

@smwikipedia僅在某種意義上將變量添加到現有對象是很奇怪的。 –

+1

@smwikipedia:反義實際上沒有多大意義,因爲所有變量都是類級變量的情況下會導致所有實例之間的共享狀態。你將有一個對單例類的引用的集合。 –

1

什麼領域之間的差別在增加飛和包含在類定義中的 ?

這是類定義:

>>> class Class1: 
    x = None 

證明:

>>> Class1().__dict__ 
{} 
>>> Class1.__dict__ 
{'x': None, '__module__': '__main__', '__doc__': None} 

這在實例級別:

>>> class Class1: 
    def __init__(self): 
    self.x = None 

證明:

>>> Class1.__dict__ 
{'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x000000000241C358>} 
>>> Class1().__dict__ 
{'x': None} 

在飛行中添加的屬性加在實例級別而不是類級別的屬性

證明:

>>> class Class1: pass 
... 
>>> foo = Class1() 
>>> foo.__dict__ 
{} 
>>> foo.x = None 
>>> foo.__dict__ 
{'x': None} 
>>> Class1.__dict__ 
{'__module__': '__main__', '__doc__': None} 

您可以在飛行類定義添加的屬性太。

證明:

>>> class Class1: pass 
... 
>>> Class1.__dict__ 
{'__module__': '__main__', '__doc__': None} 
>>> Class1().__dict__ 
{} 
>>> Class1.x = None 
>>> Class1.__dict__ 
{'x': None, '__module__': '__main__', '__doc__': None} 
>>> Class1().__dict__ 
{} 
>>> Class1().x 
>>> print Class1().x 
None