Python 在一个方法中创建的属性不';在其他方法中不存在
这里我有一个属性“a”,它是在第一个类方法中定义的,应该在第二个类方法中更改。 按顺序调用时,将显示以下消息: AttributeError:“Class”对象没有属性“a” 我发现的唯一方法是在第二个方法中再次定义“a”,但在实际代码中,它有很长的继承性,应用程序将被弄乱。 为什么不起作用?self.a不等于Class.a吗 当您在不调用Python 在一个方法中创建的属性不';在其他方法中不存在,python,class,attributes,Python,Class,Attributes,这里我有一个属性“a”,它是在第一个类方法中定义的,应该在第二个类方法中更改。 按顺序调用时,将显示以下消息: AttributeError:“Class”对象没有属性“a” 我发现的唯一方法是在第二个方法中再次定义“a”,但在实际代码中,它有很长的继承性,应用程序将被弄乱。 为什么不起作用?self.a不等于Class.a吗 当您在不调用method\u 1的情况下执行\u Class.method\u 2()的instance\u时,新创建的Class实例没有属性A,如您的示例所示 考虑一下
method\u 1
的情况下执行\u Class.method\u 2()的instance\u时,新创建的Class
实例没有属性A
,如您的示例所示
考虑一下您的代码的这个稍加修改的版本:
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之前会尝试加载一个self.a
,这就是在这种情况下导致您的属性错误的原因。简短回答,不是。代码的问题是每次创建一个新实例时
Edit:正如abarnert在下面提到的那样,Class.a
和c.a
之间有很大的区别。实例属性(第二种情况)属于每个特定对象,而类属性属于类。查看下面abarnert的评论或讨论了解更多信息
您的代码相当于
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
属性初始化c
class Class:
def __init__(self):
self.a = 1 # all instances will have their own a attribute
回答得很好……但可能值得解释的是,self.a
不等于Class.a
,而不是干脆说“不”)self.a
是一个实例属性:每个Class
实例都有自己的副本<代码>类。A/Eng>是类属性:类本身有一个拷贝,不管有多少实例(有点像C++中的静态成员和相关语言)。如果你不知道为什么你想要一个class属性,你就不想要了。
class Class:
def __init__(self):
self.a = 1 # all instances will have their own a attribute