gpt4 book ai didi

Python:即时重命名方法名称

转载 作者:太空狗 更新时间:2023-10-30 01:09:09 26 4
gpt4 key购买 nike

我有许多文件使用具有以下语法的类:

o = module.CreateObject()
a = o.get_Field

现在实现已从“get_XXX”和“set_XXX”更改为“XXX”:

o = module.CreateObject()
a = o.Field

这个实现是一个外部包,我不想改变。是否可以编写一个包装器来即时拦截对“get_XXX”的所有调用,然后用对新名称“XXX”的调用替换?

o = MyRenamer(module.CreateObject())
a = o.get_Field # works as before, o.Field is called
a = o.DoIt() # works as before, o.DoIt is called

它需要拦截所有调用,而不仅仅是对有限字段集的调用,根据方法名称决定是否修改它并调用修改名称的方法。

最佳答案

如果您想继续在已切换到使用属性的对象上使用 get_Fieldset_Field(您只需访问或分配给 Field),可以使用包装器对象:

class NoPropertyAdaptor(object):
def __init__(self, obj):
self.obj = obj

def __getattr__(self, name):
if name.startswith("get_"):
return lambda: getattr(self.obj, name[4:])
elif name.startswith("set_"):
return lambda value: setattr(self.obj, name[4:], value)
else:
return getattr(self.obj, name)

如果您在对象上使用额外的语法,例如索引或迭代,或者如果您需要使用 isinstance 识别对象的类型,这将有问题。

一个更复杂的解决方案是创建一个子类来重写名称并强制对象使用它。这不完全是包装,因为外部代码仍将直接处理对象(因此魔术方法和 isinstance)将按预期工作。这种方法适用于大多数对象,但对于具有奇特的元类魔术的类型和某些内置类型可能会失败:

def no_property_adaptor(obj):
class wrapper(obj.__class__):
def __getattr__(self, name):
if name.startswith("get_"):
return lambda: getattr(self, name[4:])
elif name.startswith("set_"):
return lambda value: setattr(self, name[4:], value)
else:
return super(wrapper, self).__getattr__(name)

obj.__class__ = wrapper
return obj

关于Python:即时重命名方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16184761/

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