2015-09-27 100 views
2

我开始看到一些结构是这样的:何时在模块中执行语句?

class Foo: 
    def someFunc1: 
      ... 
    def someFunc2: 
      ... 

    bar = 2 + 2 

    def someFunc3: 
      ... 

当将bar获得在这个例子中执行?

+0

之前'someFunc3'被定义(和'定义之前Foo'结束),但是someFunc2'被定义后'。在方法定义之前放置类属性是很常见的,除非有其他的好理由。 – jonrsharpe

回答

0

在类声明当模块被加载:在这种情况下

>>> class Foo: 
...  def someFunc1(self): 
...   pass 
...  def someFunc2(self): 
...   pass 
...  bar = 2 + 2 
...  def someFunc3(self): 
...   pass 
... 
>>> Foo.bar 
4 
0

bar将被认为是一类属性。它可以作为课程本身的属性以及该课程的实例访问:

以下是两个帮助您理解的示例。

访问的类的属性:访问的类的实例

class Foo(object): 
    stuff = "hello" 

Foo.stuff # will hold hello 

f = Foo() 
f.stuff # will hold "hello" 
-1

对象后已经从类中创建它会被执行时对象的属性'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) 
0

bar是一个类变量和它得到在即在模块类定义时执行水平。

Class Definition docs:

类定义为一个可执行语句。它首先评估 继承列表(如果存在)。继承列表中的每个项目应该 评估为允许子类化的类对象或类类型。然后使用新创建的本地名称空间和原始全局名称空间,在新的执行框架中执行类的套件。 (通常,该套件仅包含功能 定义。)当类的套件完成执行时,其执行 帧被丢弃,但其本地名称空间被保存。 然后使用基类 的继承列表和属性字典的已保存本地名称空间创建对象 。 类的名称在原始本地名称空间中绑定到此类对象。

当输入一个类定义,一个新的命名空间创建,并作为当地的范围 - 因此,局部变量的赋值去 到这个新的命名空间。

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