4
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参数传递给类方法的嵌套函数是否合法?我在 python-3.5.2 上运行这段代码没有问题,并且都print()显示了 A 类实例的相同地址。但是 python-3.6 在线抱怨print(self, self.a, self.b)没有selfmember a

同样有趣的是PyCharmIDE 没有self在这一行突出显示,并说它“超出了外部范围”。

我到底做错了什么?

4

1 回答 1

7

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

如果您在新函数中创建具有这些名称的新变量,它们会在外部范围内“隐藏”具有这些名称的变量,这意味着外部范围的名称是不可访问的,只要相同的名称引用内部范围中的其他内容. self只是一个普通的变量名,没有特殊含义,只是它是类实例函数的第一个参数,因此在通过点运算符调用方法时隐式传递 - 这意味着它受这些规则的约束。

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

换句话说,这也可以正常工作并且不会导致错误:

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

    inner_func1()
于 2020-03-18T13:12:20.030 回答