如果您想继续在已切换为使用属性(其中您只需访问或分配给
Field
)的对象上使用
get_Field
和
set_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
set_xxx
函数的使用,因为o.set_field(val)
现在将变成o.field = val
--- 也就是说,不仅名称会改变,语法也会改变。 - BrenBarn.get_Field()
和.set_Field()
也许是方法吗?你需要调用它们来获取值,并传入一个新值来设置它们吗?例如:o.set_Field('新值')
? - Martijn Pietersget_Field
和set_Field
方法合并为一个Field
属性,那么仅仅包装属性访问是不够的。你还需要使它们可调用。 - Blckknght