Python 在一个方法中创建的属性不';在其他方法中不存在

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,如您的示例所示 考虑一下

这里我有一个属性“a”,它是在第一个类方法中定义的,应该在第二个类方法中更改。 按顺序调用时,将显示以下消息:

AttributeError:“Class”对象没有属性“a”

我发现的唯一方法是在第二个方法中再次定义“a”,但在实际代码中,它有很长的继承性,应用程序将被弄乱。 为什么不起作用?self.a不等于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