如果要继续在已切换到使用属性的对象上使用get_Field和set_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