我有一个课程,我想覆盖各种方法,例如__str__
,__iter__
或len
。但是,所有这些方法的实现都是相同的。例如,我可能会有这样的事情:
def __len__(self):
return list.__len__(self.do_something())
def __str__(self):
return str(self.do_something())
def __iter__(self):
return list.__iter__(self.do_something())
def items(self):
return (self.do_something()).items()
我的想法是捕获方法或魔术方法,并在执行do_something
后(在一种包装函数中)调用它们。有没有办法做到这一点?或者也许有其他解决方案?
答案 0 :(得分:3)
如果你真的想要封装所有“魔法”方法,你可以使用装饰器和元类。
import functools
def magic_decorator(func):
@functools.wraps(func)
def func_wrapper(*args, **kwargs):
...
return func(*args, **kwargs)
return func_wrapper
class WrappedMagicMeta(type):
def __new__(cls, name, bases, attrs):
for k, v in attrs.items():
if k.startswith('__') and k.endswith('__') and callable(v):
attrs[k] = magic_decorator(v)
return type.__new__(cls, name, bases, attrs)
class MyCustomObject(metaclass = WrappedMagicMeta):
pass
您将实施MyCustomObject
func_wrapper
内POST job
魔术方法所需的任何功能。