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

时间:2014-12-01 14:35:53

标签: python class scope conditional-statements

我们知道用符号表示:

class Foo(object):

    a = 1

    def __init__(self):
        self.b = 2

    def c(self):
        print('c')

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

之后可用

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

class C():
    if True:
         a = 1
    b = 2

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

class Name():
    variable = <expression>

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

2 个答案:

答案 0 :(得分:12)

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

class C:
    if some_condition:
        def optional_method(self):
            pass

或从其他地方拉取方法:

import some_module

class D:
    method_name = some_module.function_that_accepts_self

class definitions状态的Python文档:

  

类定义是可执行语句。

  

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

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

然后*Naming and binding部分会告诉您:

  

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

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

答案 1 :(得分:1)

在java中,一切都是classesobjectclasses是容器,但在python中,一切都是objectClasses也是objects。比如functions(also objects)所以当你在函数中使用条件语句时,python允许你在类中做同样的事情。

如: -

def A():
   if condition:
      do something
   elif condition:
      do somethig
   else:
      do something

是相同的

Class A()
   if condition:
      do something
   elif condition:
      do somethig
   else:
      do something

你可以分配函数,甚至可以存储在变量中,就像你为类做的那样

def A():
    pass

a = A # is valid

在java中,你不能在类之外定义函数。