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