以下是使用元类的另一种方法。它与使用__getattribute__()
相比具有重要优势,即在访问或使用其他子类属性和方法时不会产生额外的开销。如果定义了它的子类,则还支持单继承。
class Foo(object):
class __metaclass__(type):
def __new__(metaclass, classname, bases, classdict):
clsobj = super(metaclass, metaclass).__new__(metaclass, classname,
bases, classdict)
if classname != 'Foo' and 'write' in classdict:
def call_base_write_after(self, *args, **kwargs):
classdict['write'](self, *args, **kwargs)
Foo.write(self, *args, **kwargs)
setattr(clsobj, 'write', call_base_write_after)
return clsobj
def write(self, s=""):
print "-From Foo"
class Bar(Foo):
def write(self, s=""):
print 'Bar:', s
class Baz(Bar):
def write(self, s=""):
print 'Baz:', s
Bar().write('test')
Baz().write('test')
输出:
Bar: test
-From Foo
Baz: test
-From Foo
如果您希望子子类的
write()
方法在调用完自身版本后,再调用其基类版本而不是根类(
Foo
)的版本,只需更改硬编码部分即可:
Foo.write(self, *args, **kwargs)
呼叫:
super(clsobj, self).write(*args, **kwargs)
在Foo.__new__()
中。