gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:05:52 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com