dec*_*eze 38 python monkeypatching python-3.x
是否有可能修补@property我无法控制的类实例的值?
class Foo:
@property
def bar(self):
return here().be['dragons']
f = Foo()
print(f.bar) # baz
f.bar = 42 # MAGIC!
print(f.bar) # 42
Run Code Online (Sandbox Code Playgroud)
显然,上述尝试分配时会产生错误f.bar.有# MAGIC!可能吗?这个实现细节@property是一个黑盒子,而不是间接的猴子可修补.需要替换整个方法调用.它只需要影响单个实例(如果不可避免,类级别修补就可以,但改变后的行为必须只选择性地影响给定的实例,而不是该类的所有实例).
Mar*_*nen 20
子类基类(Foo)并使用__class__属性更改单个实例的类以匹配新的子类:
>>> class Foo:
... @property
... def bar(self):
... return 'Foo.bar'
...
>>> f = Foo()
>>> f.bar
'Foo.bar'
>>> class _SubFoo(Foo):
... bar = 0
...
>>> f.__class__ = _SubFoo
>>> f.bar
0
>>> f.bar = 42
>>> f.bar
42
Run Code Online (Sandbox Code Playgroud)
from module import ClassToPatch
def get_foo(self):
return 'foo'
setattr(ClassToPatch, 'foo', property(get_foo))
Run Code Online (Sandbox Code Playgroud)
要对属性进行猴子修补,还有一种更简单的方法:
from module import ClassToPatch
def get_foo(self):
return 'foo'
ClassToPatch.foo = property(get_foo)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4343 次 |
| 最近记录: |