提问人:jeandut 提问时间:9/1/2023 更新时间:9/1/2023 访问量:28
Python中实例的动态装饰方法
Dynamically decorating method of instance in Python
问:
我最近遇到了一些可以做一些可以说是黑客但有趣的事情,例如:MethodType
from types import MethodType
class MyClass():
def __init__(self, n : int):
self.list_of_items = list(range(n))
def __getitem__(self, idx):
return self.list_of_items[idx]
def foo(self):
return "foo"
def bar(self):
return "bar"
a = MyClass(10)
a.foo = MethodType(bar, a)
a.foo()
## prints bar
a[0]
# 0 (int) is printed
但是,如果我想以类似的精神动态装饰呢?
我想到的第一个想法是:__getitem__
a
def new_getitem(self, idx):
return str(self.__getitem__(idx))
a.__getitem__ = MethodType(new_getitem, a)
但是,这有两个问题:第一,第一。 在语法未修改的意义上不会更改。__getitem__
[]
a[0]
# 0 (int) is printed
这可以通过在实例的初始化中发生的一些有趣的业务来解释,以链接到最糟糕的是显式调用:[]
__getitem__
__getitem__
a.__getitem__(0)
当我们无限地重新定义时,会遇到无限递归。__getitem__
我想知道是否有一种语法允许执行此黑客,以便:
a[0] = "0" (string)
我对任何允许动态影响实例的解决方案持开放态度(使用 MethodType 不是必需的)。[]
答: 暂无答案
评论
def new_getitem(self, idx): return str(self[idx])
a.__getitem__
__getitem__
def __getitem__(self, idx) ...