我知道我可以通过执行以下操作动态地向对象添加实例方法:
import types
def my_method(self):
# logic of method
# ...
# instance is some instance of some class
instance.my_method = types.MethodType(my_method, instance)
Run Code Online (Sandbox Code Playgroud)
后来我可以打电话instance.my_method(),自我将被正确绑定,一切正常.
现在,我的问题:如何做同样的事情来获得用@property装饰新方法的行为?
我猜是这样的:
instance.my_method = types.MethodType(my_method, instance)
instance.my_method = property(instance.my_method)
Run Code Online (Sandbox Code Playgroud)
但是,这样做会instance.my_method返回一个属性对象.
Ale*_*lli 37
该property描述的对象必须生活在类,没有在实例中,有你想要的效果.如果您不想更改现有类以避免更改其他实例的行为,则需要创建"每个实例类",例如:
def addprop(inst, name, method):
cls = type(inst)
if not hasattr(cls, '__perinstance'):
cls = type(cls.__name__, (cls,), {})
cls.__perinstance = True
inst.__class__ = cls
setattr(cls, name, property(method))
Run Code Online (Sandbox Code Playgroud)
我正在用一个属性标记这些特殊的"每个实例"类,以避免addprop在同一个实例上进行多次调用时不必要地制作多个类.
请注意,与其他用途一样property,您需要将游戏中的类设置为新样式(通常通过直接或间接继承获得object),而不是默认分配给没有类的古老遗留样式(在Python 3中删除)基地.
| 归档时间: |
|
| 查看次数: |
9355 次 |
| 最近记录: |