我开始看到一些像这样的结构:
class Foo:
def someFunc1:
...
def someFunc2:
...
bar = 2 + 2
def someFunc3:
...
在此示例中何时执行bar
?
答案 0 :(得分:0)
在加载模块时进行类声明:
>>> class Foo:
... def someFunc1(self):
... pass
... def someFunc2(self):
... pass
... bar = 2 + 2
... def someFunc3(self):
... pass
...
>>> Foo.bar
4
答案 1 :(得分:0)
bar
将被视为类属性。它可以作为类本身的属性和类的实例访问:
以下两个例子可以帮助您理解。
作为班级的财产进行访问:
class Foo(object):
stuff = "hello"
Foo.stuff # will hold hello
作为班级的实例进行访问:
f = Foo()
f.stuff # will hold "hello"
答案 2 :(得分:0)
bar
是一个类变量,它在类定义时执行,即在模块级执行。
类定义是可执行语句。它首先评估 继承列表,如果存在。继承列表中的每个项目都应该 求值为允许子类化的类对象或类类型。该 然后使用新创建的本地命名空间和新的执行框架在新的执行框架中执行类的套件 原始全局命名空间(通常,套件仅包含功能 定义。)当类的套件完成执行时,执行它 帧被丢弃但保存了本地命名空间。 一堂课 然后使用基类的继承列表创建对象 以及属性字典的已保存本地名称空间。该类 name绑定到原始本地名称空间中的此类对象。
输入类定义时,会创建一个新的命名空间 用作本地范围 - 因此,所有对局部变量的赋值都会进行 进入这个新的命名空间。
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
答案 3 :(得分:-1)
在从类创建一个对象之后,当对象的属性“bar&#39;被称为。
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)