编程语言
首页 > 编程语言> > python – 为什么类的主体在定义时被执行?

python – 为什么类的主体在定义时被执行?

作者:互联网

与函数相反,类的主体在定义时执行:

class A(object):
    print 'hello'

日期:

hello

为什么会这样?它与@classmethod / @staticmethod方法和类属性有关吗?

解决方法:

当Python首次导入模块时,一切都在模块级执行.函数体(和生成器表达式主体)在这里是例外,而不是规则. Python执行所有操作以创建模块中包含的对象;就像Python中的所有东西一样,类是对象,函数也是如此.

类主体使用单独的代码对象的唯一原因是因为类主体在单独的命名空间中执行,然后该命名空间形成类属性.类主体不是唯一的这样的名称空间; set和dict comprehensions,在Python 3中,列表推导也使用单独的命名空间执行,并对其本地人进行范围设定.

因此函数和生成器表达式是例外,因为它们的整个目的是在以后执行.请注意,函数定义已执行:

>>> import dis
>>> dis.dis(compile('def foo(): pass', '<stdin>', 'exec'))
  1           0 LOAD_CONST               0 (<code object foo at 0x106aef2b0, file "<stdin>", line 1>)
              3 MAKE_FUNCTION            0
              6 STORE_NAME               0 (foo)
              9 LOAD_CONST               1 (None)
             12 RETURN_VALUE        

MAKE_FUNCTION字节码在那里创建了函数对象,以及该函数的存储字节码,结果绑定到全局名称foo.

类对象在这里没有什么不同; class语句产生一个类对象,作为该对象的一部分,我们需要知道类体的属性.

如果Python没有执行类主体,则其他代码无法使用这些类成员.您无法访问类属性(包括类方法和静态方法),无法设置类属性等.

当然,任何属于类主体的函数都不会在那时执行.就像顶级函数一样,只执行MAKE_FUNCTION字节码,然后将生成的本地名称(使用STORE_FAST设置)转换为类属性,类似于使用STORE_NAME绑定到全局的全局函数对象.

标签:python,class,python-2-7,python-internals
来源: https://codeday.me/bug/20190917/1808756.html