好吧,如果您不介意复制子类中的原始方法,则可以使用以下技术。
import new
def copyfunc(func):
return new.function(func.func_code, func.func_globals, func.func_name,
func.func_defaults, func.func_closure)
class Metaclass(type):
def __new__(meta, name, bases, attrs):
for key in attrs.keys():
if key[0] == '_':
skey = key[1:]
for base in bases:
original = getattr(base, skey, None)
if original is not None:
copy = copyfunc(original)
copy.__doc__ = attrs[key].__doc__
attrs[skey] = copy
break
return type.__new__(meta, name, bases, attrs)
class Class(object):
__metaclass__ = Metaclass
def execute(self):
'''original doc-string'''
return self._execute()
class Subclass(Class):
def _execute(self):
'''sub-class doc-string'''
pass
是否有任何很好的理由,为什么执行的文档字符串不能只读“不......”然后调用_execute,哪些子类预计会覆盖;查看_execute的文档以获取详细信息“? 如果用户需要提供基类,那么这似乎是最为Pythonic的方法。 – 2008-09-16 14:41:23
它只是觉得有点不对,如果用户输入帮助(o.execute),他会a)不会得到他可能想要的信息,并且b)被告知查看一些可疑的方法_execute,可能他甚至不知道存在。对于图书馆的一个天真的用户来说,这只是太多的实现细节。 – nikow 2008-09-27 17:27:49