python: 将 self 传递给 class 方法内的嵌套函数是否合法?

python: is it legal to pass self to the nested function inside the class method?

class A:
    def __init__(self):
        self.name = None
        self.a = 10
        self.b = 20
        self.c = 30
    def func1(self, param1, param2):
        def inner_func1(self, param1, param2):
            print(self, self.a, self.b)

        inner_func1(self, param1, param2)

a = A()
print(a)
a.func1(1,2)

我的第一个问题 -- 将 self 参数传递给 class 方法的嵌套函数是否合法?我 运行 这段代码在 python-3.5.2 上没有问题,并且 print() 显示 class A 实例的相同地址。然而 python-3.6 在行 print(self, self.a, self.b) 上抱怨 self 没有成员 a.

同样有趣的是,PyCharm IDE 并没有在这一行突出显示 self,而是说 "outshades the outer scope".

我到底做错了什么?

作用域内定义的任何函数都可以使用其封闭作用域中的变量。在这种情况下,您在函数 中定义函数 ,因此封闭函数中的所有变量都可用 - self, param1, and param2。所以你可以self作为参数传递给内部函数,但是因为它已经可以访问self,所以这样做没有多大意义。

如果您在新函数中使用这些名称创建新变量,它们 "shadow" 外部作用域中具有这些名称的变量,这意味着只要引用相同的名称,就无法访​​问外部作用域中的名称到内部范围内的其他东西。 self 只是一个没有特殊含义的普通变量名,除了它是 class 实例函数的第一个参数,因此在通过点运算符调用方法时隐式传递 - 意思是它受这些规则的约束。

在您的内部函数中,您正在显式传递 self ,这在这种情况下是无害的,但也毫无意义。 Python 3.6(和 Pycharm)给你警告,因为它不能对此进行类型检查,但仅此而已。

换句话说,这同样有效并且不会导致错误:

def func1(self, param1, param2):
    def inner_func1():
        print(self, self.a, self.b)

    inner_func1()