【发布时间】:2019-01-09 23:11:06
【问题描述】:
我正在尝试将所有方法包装在我使用特定包装方法编写的类中。
我的类继承自pythondict类,我想包装这个父类的所有方法,比如__setitem__, __getitem__等
为了实现这一点,我编写了一个元类,它使用元类中的 __init__ 方法将所有方法包装在它的子类中,所以我可以访问子类的对象(而不是不包含父方法的类定义)。
但是,在运行代码之后,我发现包装器方法从未被调用过。意味着包装没有成功。
您能帮忙找出问题所在吗?
我的代码:
def wrapper(func):
def wrapped(self, *args, **kwargs):
print 'wrapper.__call__()'
res = func(self, *args, **kwargs)
return res
return wrapped
class MyMeta(type):
def __init__(cls, classname, bases, class_dict):
print 'meta.__init__()'
new_class_dict = {}
for attr_name in dir(cls):
attr = getattr(cls, attr_name)
if hasattr(attr, '__call__'):
attr = wrapper(attr)
new_class_dict[attr_name] = attr
return super(MyMeta, cls).__init__(classname, bases, new_class_dict)
class MyDict(dict):
__metaclass__ = MyMeta
def __init__(self, *args):
print 'child.__init__()'
super(MyDict, self).__init__(*args)
d = MyDict({'key': 'value'})
d['new_key'] = 'new_value'
我得到的打印输出是:
meta.__init__()
child.__init__()
没有对 wrapper.__call__() 打印的任何引用,我放置在包装的方法中...
【问题讨论】:
标签: python-2.7 inheritance metaprogramming wrapper