为什么没有自变量的函数对该类中的其他函数不可见?

问题描述 投票:0回答:2

在 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

我想知道为什么会出现这种情况,类中定义的函数的可见性规则是什么?

python class scope visibility self
2个回答
0
投票

很难知道自己想要什么,但一种解决方案是将

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
不在另一个方法的范围内。


0
投票

兄弟。问题只是两件简单的事情。 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
© www.soinside.com 2019 - 2024. All rights reserved.