如何更改__init__中的类属性?

时间:2017-02-06 11:48:58

标签: python class attributes

class Ant:
    count = 0

    def __init__(self):
        if count == 0:
            self.real = True
        else:
            self.real = False
        count += 1

所以基本上我想要实现的是我只希望这个类的第一个实例拥有" real"属性为True,后续属性为False。我现在知道这会给我count的无限制本地错误。我如何使这项工作?

2 个答案:

答案 0 :(得分:6)

count更改为Ant.count

由于count是一个类成员(在所有Ant类实例之间共享)并且不属于特定实例,因此您应该将它与类名的前缀一起使用。

class Ant:
    count = 0

    def __init__(self):
        if Ant.count == 0:
            self.real = True
        else:
            self.real = False
        Ant.count += 1

答案 1 :(得分:1)

首选使用self.__class__.variable - 除非您希望所有子类共享相同的变量。

在这样的代码中:

class Ant:
    count = 0
"计数"价值存储在班级' __dict__属性。 如果您执行以下操作:

class Ant:
    count = 0
    def __init__(self):
         print(self.count)

Python数据模型中定义的attrobute访问机制将看到实例中没有count的实例" self",并从其类中检索值。因此,如果您从类变量中读取值,则可以使用它,就像普通实例一样。

但是,如果您的代码如下:

def __init__(self):
    self.count += 1

在不同的事情中会发生什么:Python 如上所述从类中读取属性,向其中添加1,并将新结果存储在实例中。

因此,每当您想要访问类值时,您都可以对类名进行硬编码 - (因为在运行方法代码时,类已经创建并且已经是#34;已知"):

class Ant:
    count = 0
    def __init__(self):
         Ant.count += 1

或者,更好的是,使用实例的__class__属性 - 这样您将始终获得正确子类的变量值

class Ant:
     count = 0
     def __init__(self):
         self.__class__.count += 1

class FireAnt(Ant):
     count = 0

(请注意,与上面的第二个示例一样,如果子类不包含自己的count变量,则会读取超类“count”中的值,并创建一个新值在第一次运行此代码时在子类上)