class Foo:
bar = 1
......etc.
我知道在创建实例时,bar 是之前创建的__init__
,我想知道在为 Foo 创建实例时创建 bar 属性是否是第一件事。此外,在创建任何实例之前,该栏是否已经存在于内存中?
class Foo:
bar = 1
......etc.
我知道在创建实例时,bar 是之前创建的__init__
,我想知道在为 Foo 创建实例时创建 bar 属性是否是第一件事。此外,在创建任何实例之前,该栏是否已经存在于内存中?
请记住,在 Pythonclass
中是一个可执行语句(和 也是def
)import
。因此,您的问题的答案bar
是在class
语句执行时创建。
具体来说,当一条class
语句执行时,类的主体在通常只是一个dict
. 当主体完成执行后,将创建一个类对象,并将结果的副本dict
作为__dict__
类的属性。例如,此时的 dict 包含绑定在类体内bar=1
的所有名称,还包含在类体内定义的任何函数。
实例在创建时不会获得 的副本bar
,它们只是引用回类。当您在实例上查找名称时,Python 会同时查找实例__dict__
和类的__dict__
.
这些属性存储在__dict__
类本身的 中。除非您手动分配它们,否则它们永远不会存在于实例(或者更确切地说是实例的)上。__dict__
例如,如果您self.bar += 1
在方法中使用,您将从类级变量中读取并分配给实例级变量。下次运行此语句时,它存在于实例级别,因此您阅读该语句并将其替换为.1
2
bar
2
3
状态变量将在构造函数(init)之前分配。所以...
Class Foo:
bar = 1
def __init__(self):
bartwo = 2
不过,在分配 bartwo 之前,会看到 bar 的值为 1。我的猜测是你的问题是“如果我在构造函数之前分配一个状态变量,我可以在构造函数中使用它吗?是的。