2013-04-22 124 views
11

這裏我有一個屬性'a',它是在第一類方法中定義的,應該在第二個方法中更改。 當爲了打電話給他們,出現此消息:AttributeError:'Class'對象沒有屬性'a'

AttributeError: 'Class' object has no attribute 'a'

我發現的唯一途徑 - 定義「一」又在第二個方法,但在實際的代碼具有長期的繼承和應用程序將被搞砸。 它爲什麼不起作用?是不是self.a等於Class.a

class Class(object): 
    def method_1(self): 
     self.a = 1 
    def method_2(self): 
     self.a += 1 

Class().method_1() 
Class().method_2() 

回答

14

簡答題,沒有。你的代碼的問題是每次你創建一個新的實例。

編輯:如下文所述,Class.ac.a之間存在很大差異。實例屬性(第二種情況)屬於每個特定對象,而類屬性屬於該類。請查看下面的abarnert的評論或討論here瞭解更多信息。

您的代碼就相當於

c1 = Class() 
c1.method_1() # defines c1.a (an instance attribute) 
c2 = Class() 
c2.method_2() # c2.a undefined (the c2 instance doesn't have the attribute) 

你可能想要做財產以後像

c = Class() 
c.method_1() # c.a = 1 
c.method_2() # c.a = 2 
print "c.a is %d" % c.a # prints "c.a is 2" 

或者甚至可能是更好的將是與a屬性

class Class: 
    def __init__(self): 
     self.a = 1 # all instances will have their own a attribute 
+8

大初始化c答案......但可能值得解釋的是'self.a'不等於'Class.a',而不是簡單地說「不」)。 'self.a'是一個_instance屬性_:每個''''''實例都有自己的副本。 'Class.a'是一個_class attribute_:無論有多少實例(類似於C++和相關語言中的靜態成員),類本身都有一個副本。如果你不知道爲什麼你想要一個班級屬性,你不需要一個。 – abarnert 2013-04-23 00:19:11

3

Class一個新創建實例沒有屬性,當你做instance_of_class.method_2()a沒有調用method_1,在你的榜樣。

考慮一下這個稍微改變你的代碼的版本:

class CreateNewClassInstance(object): 
    def create_a(self): 
     self.a = 1 
    def add_one_to_a(self): 
     self.a += 1 

CreateNewClassInstance().create_a() 
CreateNewClassInstance().add_one_to_a() 

每次調用Class()(或CreateNewClassInstance())時創建一個新對象,有自己的屬性a。在初始化a之前,您沒有具有該名稱的屬性。

大多數情況下,這不是一個問題 - 但是,+=將在加入之前嘗試加載self.a - 這是導致您的AttributeError在這種情況下的原因。