我在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。这种理解是否正确?我希望在这里感到失望,我只想要确认。
答案 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。