python:将自身传递给类方法内的嵌套函数合法吗?

问题描述 投票:1回答:1
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,而是说它“使外部作用域超出了阴影”。

我到底在做什么错?

python python-3.x python-class
1个回答
4
投票

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

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

在您的内部函数中,您正在传递self 明确地,这在这种情况下是无害的,但也没有意义。 Python 3.6(和Pycharm)向您发出警告,因为它无法对此进行类型检查,仅此而已。

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

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

    inner_func1()
© www.soinside.com 2019 - 2024. All rights reserved.