繁体   English   中英

如何更改__init__中的类属性?

[英]How to change a class attribute inside __init__?

class Ant:
    count = 0

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

基本上我想要实现的是我只想让这个类的第一个实例将“real”属性设置为True ,将后续属性设置为False 我现在知道这会给我带来unboundlocal错误的count 我该如何工作?

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

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

在这样的代码中:

class Ant:
    count = 0

“count”值存储在类' __dict__属性中。 如果您执行以下操作:

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

Python的数据模型中定义的attrobute访问机制将看到实例“self”中没有count实例,并从其类中检索值。 因此,如果您正在从类变量中读取值,则可以将其用作普通实例。

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

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

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

因此,无论何时您想要访问类值,您都可以对类名进行硬编码 - (因为在运行方法代码时,类已经创建并且“已知”):

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的值,并在第一次运行此代码时在子类上创建一个新值)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM