Python类的属性是何时创建的?

3
class Foo:
   bar = 1
   ......etc.

我知道在创建实例时,__init__ 之前会先创建 bar 属性, 我想知道当创建 Foo 实例时是否首先创建 bar 属性。 此外,在创建任何实例之前,bar 是否已经存在于内存中?


1
通常在这种情况下,阅读http://docs.python.org/2/reference/datamodel.html是值得的。 - ThiefMaster
3个回答

6
请记住,在Python中,class是一个可执行语句(defimport也是如此)。因此,你的问题的答案是在class语句执行时创建了bar
具体来说,当class语句执行时,类的主体在通常只是一个dict的名称空间中执行。当主体执行完成后,将创建一个类对象,并使用结果dict的副本作为类的__dict__属性。 此时,该dict包含所有在类主体内绑定的名称,例如bar=1,还包括在类主体中定义的任何函数。
实例在创建时不会获得bar的副本,它们只是引用类。当你在实例上查找名称时,Python会同时查找实例的__dict__和类的__dict__

对我来说是一个完美的答案。谢谢 Duncan。 - Robert Bean

0

状态变量将在构造函数(init)之前被分配。因此...

    Class Foo:
        bar = 1
        def __init__(self):
            bartwo = 2

尽管在分配bartwo之前,bar的值将为1。 我猜你的问题是“如果我在构造函数之前分配状态变量,我可以在构造函数中使用它吗?” 是的。


0

这些属性存储在类本身的__dict__中。除非您手动分配,否则它们永远不会存在于实例(或实例的__dict__)中。

例如,如果您在方法中使用self.bar += 1,则将从类级变量中读取1并将2分配给实例级变量。下次运行此语句时,bar存在于实例级别,因此您将读取该2并将其替换为3


好的,我主要想知道“bar”属性何时被存储在内存中,是在任何实例创建之前? - Robert Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接