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

我知道在创建实例时,bar 是之前创建的__init__,我想知道在为 Foo 创建实例时创建 bar 属性是否是第一件事。此外,在创建任何实例之前,该栏是否已经存在于内存中?

4

3 回答 3

6

请记住,在 Pythonclass中是一个可执行语句(和 也是defimport。因此,您的问题的答案bar是在class语句执行时创建。

具体来说,当一条class语句执行时,类的主体在通常只是一个dict. 当主体完成执行后,将创建一个类对象,并将结果的副本dict作为__dict__类的属性。例如,此时的 dict 包含绑定在类体内bar=1的所有名称,还包含在类体内定义的任何函数。

实例在创建时不会获得 的副本bar,它们只是引用回类。当您在实例上查找名称时,Python 会同时查找实例__dict__和类的__dict__.

于 2013-09-25T12:32:16.710 回答
0

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

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

于 2013-09-25T12:17:34.897 回答
0

状态变量将在构造函数(init)之前分配。所以...

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

不过,在分配 bartwo 之前,会看到 bar 的值为 1。我的猜测是你的问题是“如果我在构造函数之前分配一个状态变量,我可以在构造函数中使用它吗?是的。

于 2013-09-25T12:20:01.510 回答