加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在Python类继承中继承docstrings

发布时间:2020-12-20 10:31:42 所属栏目:Python 来源:网络整理
导读:我正在尝试在 Python中进行一些类继承.我希望每个班级和继承的班级都有良好的文档字符串.所以我认为对于继承的类,我希望它: 继承基类docstring 可能会将相关的额外文档附加到docstring 在类继承情况下是否有任何(可能是优雅或pythonic)方式进行此类文档字符
我正在尝试在 Python中进行一些类继承.我希望每个班级和继承的班级都有良好的文档字符串.所以我认为对于继承的类,我希望它:

>继承基类docstring
>可能会将相关的额外文档附加到docstring

在类继承情况下是否有任何(可能是优雅或pythonic)方式进行此类文档字符串操作?多重继承怎么样?

解决方法

你并不是唯一的一个!不久之前有关于comp.lang.python的讨论,并且创建了一个食谱.看看 here.

"""
doc_inherit decorator

Usage:

class Foo(object):
    def foo(self):
        "Frobber"
        pass

class Bar(Foo):
    @doc_inherit
    def foo(self):
        pass 

Now,Bar.foo.__doc__ == Bar().foo.__doc__ == Foo.foo.__doc__ == "Frobber"
"""

from functools import wraps

class DocInherit(object):
    """
    Docstring inheriting method descriptor

    The class itself is also used as a decorator
    """

    def __init__(self,mthd):
        self.mthd = mthd
        self.name = mthd.__name__

    def __get__(self,obj,cls):
        if obj:
            return self.get_with_inst(obj,cls)
        else:
            return self.get_no_inst(cls)

    def get_with_inst(self,cls):

        overridden = getattr(super(cls,obj),self.name,None)

        @wraps(self.mthd,assigned=('__name__','__module__'))
        def f(*args,**kwargs):
            return self.mthd(obj,*args,**kwargs)

        return self.use_parent_doc(f,overridden)

    def get_no_inst(self,cls):

        for parent in cls.__mro__[1:]:
            overridden = getattr(parent,None)
            if overridden: break

        @wraps(self.mthd,**kwargs):
            return self.mthd(*args,overridden)

    def use_parent_doc(self,func,source):
        if source is None:
            raise NameError,("Can't find '%s' in parents"%self.name)
        func.__doc__ = source.__doc__
        return func

doc_inherit = DocInherit

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读