2014-01-10 141 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