gpt4 book ai didi

Python - 为实例覆盖 __getattribute__?

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:49 24 4
gpt4 key购买 nike

这个对我来说似乎有点棘手。前段时间我已经设法用类似的东西覆盖实例的方法:

def my_method(self, attr):
pass

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

这对我来说效果很好;但现在我正在尝试覆盖实例的 __getattribute__() 函数,这对我不起作用,因为该方法似乎是

<type 'method-wrapper'>

有什么办法可以解决这个问题吗?我在 method-wrapper 上找不到任何像样的 Python 文档。

最佳答案

您想在每个实例的基础上覆盖属性查找算法吗?在不知道你为什么要这样做的情况下,我会冒险猜测有一种更简洁的方式来做你需要做的事情。如果你真的需要像 Aaron 所说的那样,你需要在类上安装一个重定向 __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

此外,如果您要重写实例上的方法,则无需自己实例化方法对象,您可以在生成方法的函数上使用描述符协议(protocol),或者仅柯里化(Currying) self 参数。

 #descriptor protocol
self.method_to_overwrite = my_method.__get__(self, type(self))
# or curry
from functools import partial
self.method_to_overwrite = partial(my_method, self)

关于Python - 为实例覆盖 __getattribute__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1560853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com