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

时间:2013-04-22 23:57:54

标签: python class attributes

这里我有一个属性' 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()

2 个答案:

答案 0 :(得分:15)

简短的回答,没有。您的代码的问题在于每次创建新实例时。

修改:正如下面提到的那样,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"

或者更好的方法是使用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}}在这种情况下的原因