SORU
8 Ocak 2010, Cuma


Python sınıf miras docstrings miras

Python ile bazı sınıf kalıtım yapmaya çalışıyorum. Her sınıf istiyorum ve sınıfı iyi docstrings zorunda kaldı. Devralınan sınıfı için bence O yüzden istiyorum:

  • temel sınıf kütüphane miras
  • aynı zamanda da Fibonacci ilgili ek belgeleri ekleyin

Orada "en iyi kütüphane bu tür işler yapmak için" sınıf mirası bir durumda manipülasyon? uygulamadır bazı Nasıl çoklu kalıtım için? İyi bir tartışma için öğretici bir yerlerde zaten var mı?

CEVAP
8 Ocak 2010, Cuma


Bir tek sen değilsin! comp.lang.python Bu konuda bir süre önce bir tartışma vardı, ve bir reçete oluşturuldu. Şuna bir bakhere.

"""
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, obj, 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, self.name, None)
            if overridden: break

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

        return self.use_parent_doc(f, 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 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chriselle Lim

    Chriselle Li

    26 Ocak 2008
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011
  • UberFacts

    UberFacts

    26 EKİM 2013