使用一种方法的文档字符串自动覆盖另一种方法的文档字符串

nik*_*kow 4 python metaclass

问题:我有一个类,其中包含一个execute调用另一个方法的模板方法_execute。子类应该重写_execute以实现某些特定功能。此功能应记录在 的文档字符串中_execute。高级用户可以创建自己的子类来扩展库。但是,处理此类子类的另一个用户应该只使用execute,因此如果他使用 ,他将看不到正确的文档字符串help(execute)

因此,最好以这样的方式修改基类,以便在子类中 的文档字符串execute自动替换为 的文档字符串_execute。有什么想法可以做到这一点吗?

我正在考虑使用元类来做到这一点,使这对用户完全透明。

Syl*_*sne 5

好吧,如果您不介意在子类中复制原始方法,则可以使用以下技术。

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
Run Code Online (Sandbox Code Playgroud)