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

标签 python

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

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:') 

最佳答案

当您编写这种形式的代码块时:

class Name:
    <statements>

Python 始终运行 <statements> ,就在那时和那里。主要区别在于,如果这些语句中的任何一个定义了变量,则这些变量不会在全局命名空间中设置;相反,它们被“舀起”并保存在字典中,该字典与一个名为(在本例中)Name 的对象关联。 .

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

a = 1
print(a) # prints 1

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

class Name1:
    a = 2
    print(a) # prints 2

但是类定义结束后,变量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 启动函数定义 block 时关键字,此时 block 内的语句执行。

def func():
    a = 4
    print(a)

# this prints nothing unless you call func()

它们会一直保存到稍后您调用该函数时。但类在这方面与函数不同。

关于python - python类的所有语句在没有对象创建的情况下执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45951535/

相关文章:

python - 如何在 Numpy 中迭代一维数组并构建二维数组?

python - 如何编写 python 脚本以在 linux mint 中打开应用程序

python - sqlalchemy的数据类型中Varchar和String有什么区别?

python - 使用时覆盖 python 文件?

python - 通过使用 Python 将某些参数传递给它来执行 shell 脚本?

Python - 从 Google Cloud Storage 下载整个目录

python - Django 模板和本地技巧

python - Python中的异步方法调用?

python - Django - 每 x 秒运行一个函数

python - Django ORM - objects.filter() 与 objects.all().filter() - 哪个是首选?