python类的所有语句在没有对象创建的情况下执行

时间:2017-08-30 03:43:40

标签: python

我是python的新手,只是在一个模块中创建了3个类,即全局范围,在函数内和if块中。在运行模块时,所有类的所有语句都在运行。我很惊讶为什么在没有创建任何对象的情况下执行所有类。

class Demo:
    print('global class Demo')

def test():
    print('Demo')
    class Demo:
        x = 'Demo from fuction test()'
        print(x)

test()

if True:
    class Demo:
        print('Demo from if:') 

3 个答案:

答案 0 :(得分:1)

来自Python doc

  

类定义是可执行语句。

和...

  

然后在新的执行框架中执行类的套件(参见   命名和绑定),使用新创建的本地命名空间和   原始全局命名空间(通常,套件主要包含   函数定义。)当类的套件完成执行时,它的   执行帧被丢弃,但保存了本地命名空间。 [4] A.   然后使用基类的继承列表创建类对象   类和属性字典的已保存本地名称空间。   类名绑定到原始本地中的此类对象   命名空间。

答案 1 :(得分:1)

当您编写此表单的代码块时:

byte[]

Python始终运行class Name: <statements> ,然后就在那里。主要区别在于,如果这些语句中的任何一个定义变量,则不在全局命名空间中设置变量;相反,他们是&#34; scoo up&#34;并保存在字典中,该字典与称为(在本例中)<statements>的对象相关联。

例如,您知道这是如何工作的:

Name

你可以把它放在一个类定义中,它仍然可以做同样的事情:

a = 1
print(a) # prints 1

但是在类定义结束后,变量class Name1: a = 2 print(a) # prints 2 被&#34; scooped up&#34;并且不再具有类定义中的值。

a

您可能会将其与功能定义混合使用。当您使用a = 1 print(a) # prints 1 class Name2: a = 3 print(a) # prints 3 print(a) # prints 1 print(Name2) # prints <class '__main__.Name2'> print(Name2.a) # prints 3; this shows where the `a` from the class definition went 关键字启动函数定义块时,块中的语句当时执行。

def

当你调用该函数时,它们会保存到以后。但是类不像这样的函数。

答案 2 :(得分:0)

很难说出你在问什么,但是定义一个类与创建一个对象是不一样的。您需要调用该类来创建一个实例(您正在寻找的对象)。

# The class (a type)
class Demo:
    pass

# An instance of the class (an object)
Demo()