在PyCharm中重载方法

1 投票
1 回答
2326 浏览
提问于 2025-04-17 22:49

为什么在PyCharm中重写一个方法后,无法找到如何访问它们呢?举个例子:

class A ( object):
    def __init__ (self, i = 1):
        self.i = i

    def __f1_a (self):
        return ( self.i )


class B (A) :
    def __init__ (self, j = 2):
        super () . __init__ ()
        self.j = 0

    def __f1_a (self):
        return ( self.j )


class C ( B):
    def __init__ (self, c = 100):
        self.c = c

B类中,PyCharm为什么不告诉我们如何访问这两个方法__f1_a(self)呢?当我们尝试访问B类的对象的方法时,这些方法并没有出现。不过我们可以通过以下方式访问它们(假设bB类的一个实例):

b._A__f1_a( )

b._B__f1_a( )

这两种写法都是正确的。那为什么PyCharm不告诉我们呢?我们应该知道这些吗?我觉得如果能在每个类中清楚地列出可以访问的方法,那就更明了了,应该怎么写就能看到。为什么PyCharm不这样做呢?相反,在B类中只出现了一个程序员无法访问的私有方法。

1 个回答

2

在属性名称前面加两个下划线会实现“名称改编”,这意味着这个属性只能通过 _classname__attrname 这种方式在外部访问(除了内置的“魔法方法”这种特殊情况,它们前后都有双下划线)。

这种名称改编的主要目的是为了防止外部访问这个属性。一个下划线并不会进行名称改编,它只是表示“按照约定是私有的”(也就是说,虽然可以访问,但最好不要用!)

一个更好的问题可能是:

  1. 你为什么想访问双下划线的方法?或者
  2. 如果你想让它们可以被访问,为什么要这样命名呢?

撰写回答