10

这里我有一个属性'a',它是在第一类方法中定义的,应该在第二类方法中更改。按顺序调用它们时,会出现以下消息:

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

我发现的唯一方法 - 在第二种方法中再次定义“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()
4

2 回答 2

15

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

编辑:正如 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"

或者可能更好的是c使用a属性进行初始化

class Class:
    def __init__(self):
        self.a = 1  # all instances will have their own a attribute
于 2013-04-23T00:01:53.637 回答
3

当您不调用时,新创建的实例Class没有属性,如您的示例所示。ainstance_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在这种情况下导致您的原因。

于 2013-04-23T00:01:14.443 回答