在python中动态设置实例属性/ memoized属性?

时间:2013-06-21 22:24:49

标签: python monkeypatching

我在Python 2.7x中有一个现有的示例类

class Example(object):
    a = None
    b = None
    c = None

和现有实例

anInstance = Example()
anInstance.a = 100
anInstance.b = 200
anInstance.c = 300

我一直在重构/清理一些代码,而且现在知道anInstance.c是一项很少使用的昂贵操作。

在一个完美的世界中我会这样做:

class Example(object):
    _c = None
    @property
    def c(self):
        if self._c is not None:
           self._c = DO EXPENSIVE STUFF HERE
        return self._c

问题在于我现在无法更改class Example。 [因此,quickfix将其设置为一个函数,并将每个obj.c更改为obj.c()]

据我所知,除非我改变对象,否则我无法动态分配属性/ memoization。这种理解是否正确?我希望在这里感到失望,我只想要确认。

1 个答案:

答案 0 :(得分:4)

您可以在事实之后更改python类:

@property
def c(self):
    if self._c is None:
        self._c = DO EXPENSIVE STUFF HERE
    return self._c

Example.c = c
Example._c = None

现在,您已向自己的班级添加了属性c,并添加了_c属性。

当然,您可能需要覆盖类中的任何现有方法,这些方法可以分配给self.c

动态添加或替换对象属性的过程通常称为Monkey Patching