0

我在 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。[所以快速修复是将其设置为一个函数,并将每个更改obj.cobj.c()]

据我所知,除非我更改对象,否则我无法动态分配属性/记忆。这种理解正确吗?我预计会在这里失望,我只是想要确认。

4

1 回答 1

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

于 2013-06-21T22:27:20.033 回答