我开始看到一些结构是这样的:何时在模块中执行语句?
class Foo:
def someFunc1:
...
def someFunc2:
...
bar = 2 + 2
def someFunc3:
...
当将bar
获得在这个例子中执行?
我开始看到一些结构是这样的:何时在模块中执行语句?
class Foo:
def someFunc1:
...
def someFunc2:
...
bar = 2 + 2
def someFunc3:
...
当将bar
获得在这个例子中执行?
在类声明当模块被加载:在这种情况下
>>> class Foo:
... def someFunc1(self):
... pass
... def someFunc2(self):
... pass
... bar = 2 + 2
... def someFunc3(self):
... pass
...
>>> Foo.bar
4
bar
将被认为是一类属性。它可以作为课程本身的属性以及该课程的实例访问:
以下是两个帮助您理解的示例。
访问的类的属性:访问的类的实例
class Foo(object):
stuff = "hello"
Foo.stuff # will hold hello
:
f = Foo()
f.stuff # will hold "hello"
对象后已经从类中创建它会被执行时对象的属性'bar'被调用。
class Foo():
def someFunc1():
pass
def someFunc2():
pass
bar = 2 + 2
def someFunc3():
pass
obj = Foo()
print(obj.bar)
如果没有对象被从类则它可以直接从类访问创建:
class Foo():
def someFunc1():
pass
def someFunc2():
pass
bar = 2 + 2
def someFunc3():
pass
print(Foo.bar)
bar
是一个类变量和它得到在即在模块类定义时执行水平。
类定义为一个可执行语句。它首先评估 继承列表(如果存在)。继承列表中的每个项目应该 评估为允许子类化的类对象或类类型。然后使用新创建的本地名称空间和原始全局名称空间,在新的执行框架中执行类的套件。 (通常,该套件仅包含功能 定义。)当类的套件完成执行时,其执行 帧被丢弃,但其本地名称空间被保存。 然后使用基类 的继承列表和属性字典的已保存本地名称空间创建对象 。 类的名称在原始本地名称空间中绑定到此类对象。
当输入一个类定义,一个新的命名空间创建,并作为当地的范围 - 因此,局部变量的赋值去 到这个新的命名空间。
In [1]: class Foo(object):
.....: bar = 1
.....:
In [2]: Foo.__dict__
Out[2]: <dictproxy {'__dict__': <attribute '__dict__' of 'Foo' objects>,
'__doc__': None,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Foo' objects>,
'bar': 1}> # bar class variable
In [3]: Foo.bar
Out[3]: 1
之前'someFunc3'被定义(和'定义之前Foo'结束),但是someFunc2'被定义后'。在方法定义之前放置类属性是很常见的,除非有其他的好理由。 – jonrsharpe