问题
I have an existing example class in Python 2.7x
class Example(object):
a = None
b = None
c = None
and an existing instance
anInstance = Example()
anInstance.a = 100
anInstance.b = 200
anInstance.c = 300
I've been refactoring/cleaning some code, and it's now known that anInstance.c is an expensive operation that is rarely used.
in a perfect world I would just do this :
class Example(object):
_c = None
@property
def c(self):
if self._c is not None:
self._c = DO EXPENSIVE STUFF HERE
return self._c
The problem is that I can't change class Example right now. [ So the quickfix would be to set it as a function, and change every obj.c to obj.c() ]
A far as I know there isn't any way that I can dynamically assign a property / memoization unless I alter the object. Is that understanding correct ? I'm expecting to be disappointed here, I just want the confirmation.
回答1:
You can alter python classes after the fact:
@property
def c(self):
if self._c is None:
self._c = DO EXPENSIVE STUFF HERE
return self._c
Example.c = c
Example._c = None
Now you've added a property c to your class, as well as add a _c attribute.
You may need to override any existing methods on the class that assume they can assign to self.c, of course.
The process of dynamically adding or replacing attributes of objects is often referred to as Monkey Patching.
来源:https://stackoverflow.com/questions/17245201/dynamically-set-an-instance-property-memoized-attribute-in-python