猴子在python中修补对象时的AttributeError

时间:2015-08-11 09:31:19

标签: python-3.x

我试图在Python中修补一个对象。

class C:
    def __init__(self):
        self.__n = 0

    def f(self):
        self.__n += 1

    def __str__(self):
        return str(self.__n)


c = C()

def up(self):
    self.__n += 2

import types
c.up = types.MethodType(up, c)
c.up()

但我得到了一个AttributeError

Traceback (most recent call last):
  File "untitled4.py", line 19, in <module>
    c.up()
  File "untitled4.py", line 15, in up
    self.__n += 2
AttributeError: 'C' object has no attribute '__n'

如何解决错误?

1 个答案:

答案 0 :(得分:1)

由于您的up函数未在类中声明,因此无法将name mangling规则应用于其本地,同时将其应用于属性名称。因此,您需要在函数中手动应用名称修改:

def up(self):
    self._C__n += 2