【问题标题】:Conditional statements in a class, but outside of scope of the function类中的条件语句,但在函数范围之外
【发布时间】:2015-01-29 14:14:36
【问题描述】:

我们通过符号知道这一点:

class Foo(object):

    a = 1

    def __init__(self):
        self.b = 2

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

我们可以创建静态变量Foo.a,'普通'变量b,在创建Foo的实例后可用,方法c

今天我真的很惊讶,我可以在一个类中使用条件语句,但超出了函数的范围

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

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

class Name():
    variable = <expression>

您能否描述其他涉及此特定范围的规则?我应该如何命名这个范围?

【问题讨论】:

    标签: python class scope conditional-statements


    【解决方案1】:

    类主体只是 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 部分)。 (通常,套件只包含函数定义。)当类的套件完成执行时,它的执行帧被丢弃,但它的本地命名空间被保存。然后使用基类的继承列表和属性字典的保存的本地命名空间创建一个类对象。

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

    Naming and binding 部分会告诉您:

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

    因此您在此块中定义的名称不能在方法中直接访问;你可以改用class.nameself.name

    【讨论】:

      【解决方案2】:

      在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中你不能在类之外定义函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        相关资源
        最近更新 更多