在 Python 中,当我在类中定义函数时,我可以包含
self
作为访问该类的成员变量的参数之一,如果我也可以选择不包含 self
作为参数不需要访问其成员变量。但后来我发现,如果该函数没有 self
作为参数,那么它对该类中的其他函数将变得不可见。例如
class Test:
def __init__(self, val:int) -> None:
self.a = val
def f(a:int) -> int:
return a + 1
def g(self) -> int:
return f(self.a)
if __name__ == '__main__':
t = Test(2)
print(t.g())
上述代码将导致以下错误消息:
Traceback (most recent call last):
File "/Users/louchenfei/Downloads/lc.py", line 11, in <module>
print(t.g())
File "/Users/louchenfei/Downloads/lc.py", line 7, in g
return f(self.a)
NameError: name 'f' is not defined
我想知道为什么会出现这种情况,类中定义的函数的可见性规则是什么?
很难知道自己想要什么,但一种解决方案是将
f
变成 staticmethod
。您仍然需要以某种方式引用 Test
:
class Test:
def __init__(self, val:int) -> None:
self.a = val
@staticmethod
def f(a:int) -> int:
return a + 1
def g(self) -> int:
return self.f(self.a)
if __name__ == '__main__':
t = Test(2)
print(t.g())
这里,电话是
self.f(self.a)
。
方法
f
不在另一个方法的范围内。
兄弟。问题只是两件简单的事情。
1 - 你创建的g方法在return中需要写self.f(self.a)
2-在该 return 语句中更重要的是,您传递给 f(self.a) 但您没有传递类似的数字 self.a 而是传递 self,因为您在创建 f() 方法的地方称为 self 惠特 a。
python 不关心如何在方法声明中调用实例,但第一个参数将永远是实例。
我知道的唯一方法是使用 @staticmethod 装饰器,或者如果您的 init 返回一个整数并且在 g() 返回中不传递任何内容,那么这可能是正确的...就像
这样做::
class Test(int):
def __init__(self, val:int) -> None:
self =val
def f(a:int) -> int:
return a + 1
def g(self) -> int:
return self.f()
if __name__ == '__main__':
t = Test(2)
print(t.g())
##or declare __add__
class Test:
def __init__(self, val:int)->None:
self.a =val
def f(a:int) -> int:
return a + 1
def g(self) -> int:
return self.f()
def __add__(self,other):
return self.a + other