Python重写一个实例的?

2024-05-02 12:25:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这个对我来说有点棘手。前些时候,我已经成功地用类似的方法覆盖了一个实例的方法:

def my_method(self, attr):
    pass

instancemethod = type(self.method_to_overwrite)
self.method_to_overwrite = instancemethod(my_method, self, self.__class__)

这对我来说非常有效;但是现在我试图覆盖一个实例的__getattribute__()函数,这对我来说不起作用,因为这个方法似乎是

^{pr2}$

有什么办法吗?我在method-wrapper上找不到任何像样的Python文档。在


Tags: to实例方法selfmydeftypepass
3条回答

我相信方法包装器是用C编写的方法的包装器

是否要在每个实例的基础上重写属性查找算法?在不知道你为什么要这么做的情况下,我会冒险猜测有一种更干净、更不复杂的方法来做你需要做的事情。如果您真的需要这样做,那么您需要在类上安装一个重定向__getattribute__处理程序,因为Python只在类上查找特殊方法,而忽略实例上定义的任何内容。在

您还必须特别小心不要进入无限递归:

class FunkyAttributeLookup(object):
    def __getattribute__(self, key):
        try:
            # Lookup the per instance function via objects attribute lookup
            # to avoid infinite recursion.
            getter = object.__getattribute__(self, 'instance_getattribute')
            return getter(key)
        except AttributeError:
            return object.__getattribute__(self, key)

f = FunkyAttributeLookup()
f.instance_getattribute = lambda attr: attr.upper()
print(f.foo) # FOO

另外,如果要重写实例上的方法,则不需要自己实例化方法对象,可以在生成方法的函数上使用描述符协议,也可以只调用自参数。在

^{pr2}$

相关问题 更多 >