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