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