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

Posted

技术标签:

【中文标题】类中的条件语句,但在函数范围之外【英文标题】: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>

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

【问题讨论】:

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

【讨论】:

以上是关于类中的条件语句,但在函数范围之外的主要内容,如果未能解决你的问题,请参考以下文章

18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询

sql语句中使用innot in 查询时,注意条件范围中的null值处理事项

python中单行lambda函数中的条件语句?

SQL语句—where条件查询

golang函数 和 条件语句

03_数据库之DML语句