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

标签 python python-3.x python-class

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没有成员(member) a .

同样有趣的是PyCharm IDE 不突出显示 self在这条线上,并说它“超越了外部范围”。

我到底做错了什么?

最佳答案

在作用域内定义的任何函数都可以使用其封闭作用域中的变量。在这种情况下,您在函数内定义了一个函数,因此封闭函数中的所有变量都可用 - 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()

关于python:将self传递给类方法内的嵌套函数是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60740232/

相关文章:

python - 在 python 3.6+ 和 PyQt5 中 pickle QPolygon

python - 时钟类错误处理的最佳方法?

python - 类型为 `type` 的枚举类作为 mixin

python - 将 sympy 矩阵转换为两种形式 (sympy.diffgeom)

python - 将 pandas 数据框转换为基于列的订单列表

python-3.x - 如何通过本地 Docker 容器中的 python 应用程序从云存储桶中读取文件

python - 反射 dunder 方法不适用于相同类型的实例

python - 如何将具有多个值的嵌套字典导出到 excel

python - 强制 scrapy 抓取链接以使其出现

python-3.x - Pandas :AttributeError: 'function' 对象没有属性 'contains'