在Python中运行时重写方法

2 投票
1 回答
824 浏览
提问于 2025-04-15 22:33

我有一个方法需要运行很多次。我不想把很多if语句嵌套在里面,而是想重写这个方法,然后再运行它。我知道可以通过简单的赋值来重写类的方法,但重写后的方法看不到私有成员。

class X:
    def __init__(self, a):
        self.a = a
        self.__b = a

    def m(self):
        print self.a
        print self.__b

def a2(self):
    print (2*self.a)
    print (2*self.__b)

x = X(2)
x.m()
X.m = a2
x.m()

输出:

2
2
4
Traceback (most recent call last):
  File "t.py", line 17, in <module>
    x.m()
  File "t.py", line 12, in a2
    print (2*self.__b)
AttributeError: X instance has no attribute '__b'

有没有办法解决这个问题?谷歌没有显示答案 :(

1 个回答

4

在类里面,以双下划线开头的属性会被特殊处理,这种处理叫做名称改编。除非你非常确定需要使用它们,否则最好不要用。其实它们并不是私有的,所以你可以用一个下划线来代替。

你遇到这个问题的原因是因为在 a2() 里面访问的属性并没有经过名称改编。

撰写回答