方法参数中的命名空间

时间:2011-08-18 15:47:27

标签: python class namespaces

我很惊讶方法中函数参数的命名空间是类,而不是全局范围。

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()

1 个答案:

答案 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

正如所料。