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

2024-10-01 13:40:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

AttributeError: 'Class' object has no attribute 'a'

我发现的唯一方法是在第二个方法中再次定义“a”,但在实际代码中它有很长的继承性,应用程序将被弄乱。 为什么不起作用?难道自我。a等于类。a吗?

class Class(object):
    def method_1(self):
        self.a = 1
    def method_2(self):
        self.a += 1

Class().method_1()
Class().method_2()

Tags: 方法no代码self消息属性定义object
2条回答

简而言之,不是。代码的问题在于每次创建新实例时。

编辑:正如abarnert在下面提到的,在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"

或者更好的方法是使用a属性初始化c

class Class:
    def __init__(self):
        self.a = 1  # all instances will have their own a attribute

新创建的Class的实例没有属性a,而不调用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的原因。

相关问题 更多 >