类中的条件语句,但在函数范围之外

noi*_*isy 9 python scope class conditional-statements

我们知道用符号表示:

class Foo(object):

    a = 1

    def __init__(self):
        self.b = 2

    def c(self):
        print('c')
Run Code Online (Sandbox Code Playgroud)

我们可以创建静态变量Foo.a,'normal'变量b,它将在创建和实例Foo以及方法之后可用c

今天我真的很惊讶,我可以在类中使用条件语句,但不在函数范围内

class C():
    if True:
         a = 1
    b = 2
Run Code Online (Sandbox Code Playgroud)

像C++/Java这样的语言告诉我法律符号类似于:

class Name():
    variable = <expression>
Run Code Online (Sandbox Code Playgroud)

你能描述一下其他规则吗?我该如何命名这个范围?

Mar*_*ers 12

类主体只是Python代码.它有特定的范围规则,但除此之外别无其他.这意味着您可以有条件地创建函数:

class C:
    if some_condition:
        def optional_method(self):
            pass
Run Code Online (Sandbox Code Playgroud)

或从其他地方拉取方法:

import some_module

class D:
    method_name = some_module.function_that_accepts_self
Run Code Online (Sandbox Code Playgroud)

等等

class定义的Python文档说明:

类定义是可执行语句.

然后使用新创建的本地命名空间和原始全局命名空间,在新的执行框架中执行类的套件(请参阅命名和绑定一节).(通常,套件仅包含函数定义.)当类的套件完成执行时,其执行帧将被丢弃,但其本地名称空间将被保存.然后使用基类的继承列表和属性字典的已保存本地名称空间创建类对象.

通常在该文本中注意.本质上,类主体是作为函数执行的,并且您在body命名空间中放置的任何内容都将成为类的属性.

*命名并结合部分,然后告诉你:

类块中定义的名称范围仅限于类块; 它没有扩展到方法的代码块

所以你在这个块中定义的名称不能直接在方法中访问; 你使用class.nameself.name代替.