【问题标题】:How to use class name in class scope?如何在类范围内使用类名?
【发布时间】:2013-11-06 12:03:33
【问题描述】:

我对 Python 不是很熟悉。所以我在编码时遇到了一些问题。

功能块中使用功能名称是很正常的,例如:

def factorial(n):
    if n == 1:
        return n
    else:
        return n * factorial(n-1)

但是当我尝试在 类块 中使用 类名 时,出现问题:

class Foo(object):
    a = Foo
NameError: name 'Foo' is not defined

虽然下面的代码没问题:

class Foo(object):
    def __init__(self):
        a = Foo

然后我使用print globals() 语句调试这两个代码。我发现class block中的全局变量dict不包含class Foo,而__init__function block中的全局变量dict包含它。

看来类名绑定是在class block执行之后,function block执行之前。

但我不喜欢在编码的基础领域进行猜测。任何人都可以提供更好的解释或官方材料吗?

【问题讨论】:

  • 您在第一个示例中没有看到递归。
  • 是的,我明白了。我说用起来很正常。该代码计算阶乘。

标签: python class


【解决方案1】:

你的解释是正确的:

类名绑定在类块执行之后,功能块执行之前。

这只是说一个类块被立即执行,而一个功能块直到函数被调用才被执行。请注意,在这两种情况下,名称直到对象(类或函数)创建后才绑定;只是函数体在创建函数之后执行,而类体在创建类之前执行(作为类创建过程的一部分)。

这是因为类和函数是不同的野兽:当你定义一个类时,你是在“现在”定义类应该包含的内容(即它的方法和属性);当你定义一个函数时,你是在定义稍后会发生什么(当你调用它时)。

The documentation 说的很清楚:

类定义是一个可执行语句。它首先评估继承列表(如果存在)。 [...] 然后执行该类的套件 [...]

在执行class 语句时执行类主体。这与其他一些语言不同,其中类定义是一个“声明”,它不像其他语句那样按照源文件的线性顺序执行。 (我相信很明显为什么函数体在定义函数时执行——如果它立即运行,将代码放入函数中没有多大意义。)

【讨论】:

  • 非常感谢。我没有仔细阅读the document,忽略了实现细节。
猜你喜欢
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2017-02-09
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多