为什么函数标签在该函数中的范围内,但类方法标签本身不在范围内?

时间:2018-05-08 17:13:08

标签: python python-3.x class oop

如果func是一个全局函数,

func可以自己引用它。

def func(y):
    result = func.x + y
    # `func.x` does not raise an errors
    return result   
func.x = 5  

func(100)

但是,类方法似乎无法引用自身:

class K:        
    def mthd(self, y):
        return mthd.x + y
    mthd.x = 5

K.mthd() # raises an exception

引发的异常是NameError

[Drive Letter]:\[path]
Traceback (most recent call last):
  File "[Path]/[filename].py", line 35, in <module>
    K.mthd()
  File "[Path]/[filename].py", line 40, in mthd
    return mthd.x + y
NameError: name 'mthd' is not defined

Process finished with exit code 1

为什么会这样?

是因为"func"位于globals"mthd"位于K.__dict__吗?

函数可以引用自身之外的变量,例如:

x = 3
def f():
    print(x)

是否导致错误是因为K.mthd可以访问名称localsglobals,而不是K.__dict__

1 个答案:

答案 0 :(得分:3)

func是全局名称,mthd不是。方法是类对象的属性, 可用作全局:

K.mthd.x

class正文(套件)本身中,mthd是本地名称;在class语句的末尾,所有本地人都被用来组成班级团体;创建类后,本地名称将不再可用。

来自Class definitions section of the Python reference documentation

  

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

因此,在您的代码中,行mthd.x = 5类似于访问函数体中的locals。就像resultfunc()函数范围之外不可用一样,mthd在类创建期间可用的命名空间之外不可用。

class套件可以正常引用全局变量,方法可以:

>>> x = 42
>>> class Demo:
...     print('Class body, globals are available, like x =', x)
...     def method(self):
...         print('Method body, globals are available, like x =', x)
...
Class body, globals are available, like x = 42
>>> Demo().method()
Method body, globals are available, like x = 42