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
可以访问名称locals
和globals
,而不是K.__dict__
?
答案 0 :(得分:3)
func
是全局名称,mthd
不是。方法是类对象的属性, 可用作全局:
K.mthd.x
在class
正文(套件)本身中,mthd
是本地名称;在class
语句的末尾,所有本地人都被用来组成班级团体;创建类后,本地名称将不再可用。
来自Class definitions section of the Python reference documentation:
然后使用新创建的本地命名空间和原始全局命名空间,在新的执行框架 [...] 中执行类的套件。 (通常,该套件主要包含函数定义。)当类的套件完成执行时,其执行框架将被丢弃,但其本地名称空间将被保存。然后使用基类的继承列表和属性字典的已保存本地名称空间创建类对象。
因此,在您的代码中,行mthd.x = 5
类似于访问函数体中的locals。就像result
在func()
函数范围之外不可用一样,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