我很惊讶方法中函数参数的命名空间是类,而不是全局范围。
def a(x):
print("Global A from {}".format(x))
class Test:
def a(self, f=a):
print("A")
f("a") # this will call the global method a()
def b(self, f=a):
print("B")
f("b") # this will call the class method a()
t=Test()
t.b()
如何解释?我如何从b?
的参数中访问全局a()答案 0 :(得分:2)
命名空间查找始终首先检查本地范围。在方法定义中,即类。
在定义Test.a
时,没有本地名为a
,只有全局a
。在定义Test.b
时,Test.a
已经定义,因此本地名称a
存在,并且不检查全局范围。
如果您想将f
中的Test.b
指向全局a
,请使用:
def a(x):
print("Global A from {}".format(x))
class Test:
def a(self, f=a):
print("A")
f("a") # this will call the global method a()
def b(self, f=None):
f = f or a
print("B")
f("b") # this will call the class method a()
t=Test()
t.b()
打印
B Global A from b
正如所料。