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)
行上抱怨self
没有成员a
。
[还有一点很有趣,PyCharm
IDE不在此行上突出显示self
,而是说它“使外部作用域超出了阴影”。
我到底在做什么错?
在范围内定义的任何函数都可以使用其范围内的变量。在这种情况下,您要定义函数在函数内,因此封闭函数中的所有变量均可用-self, param1, and param2
。因此,您can将self
作为参数传递给内部函数,但是由于它已经可以访问self
,因此这样做没有什么意义。
如果您在新函数中使用这些名称创建新变量,则它们会在外部作用域中“屏蔽”具有这些名称的变量,这意味着只要相同名称引用了外部作用域中的其他名称,就无法访问外部作用域中的名称。内部范围。 self
只是一个普通的变量名,没有特殊含义,只是它是类的实例函数的第一个参数,因此在通过点运算符调用该方法时隐式传递了该变量-这意味着它受这些规则约束。
在您的内部函数中,您正在传递self
明确地,这在这种情况下是无害的,但也没有意义。 Python 3.6(和Pycharm)向您发出警告,因为它无法对此进行类型检查,仅此而已。
换句话说,这将同样有效,并且不会导致任何错误:
def func1(self, param1, param2):
def inner_func1():
print(self, self.a, self.b)
inner_func1()