这里我有一个属性' a',它在第一类方法中定义,应该在第二类中更改。 按顺序调用它们时,会显示以下消息:
AttributeError:' Class'对象没有属性' a'
我找到的唯一方法 - 定义' a'再次在第二种方法,但在实际代码中它有很长的继承和应用程序将被搞砸。 为什么它不起作用? Isn 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()
答案 0 :(得分:15)
简短的回答,没有。您的代码的问题在于每次创建新实例时。
修改:正如下面提到的那样,Class.a
和c.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"
或者更好的方法是使用c
属性
a
class Class:
def __init__(self):
self.a = 1 # all instances will have their own a attribute
答案 1 :(得分:3)
新创建的<{em}} Class
实例在a
没有调用instance_of_class.method_2()
时没有属性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
- 这就是导致{{1}}在这种情况下的原因