una programacion otra orientada objetos metodos metodo llamar instanciar herencia ejemplo como clases clase python inheritance documentation

otra - programacion orientada a objetos python pdf



Heredar docstrings en herencia de clase Python (5)

Estoy tratando de hacer una herencia de clase en Python. Me gustaría que cada clase y clase heredada tengan buenas cadenas de documentos. Así que creo que para la clase heredada, me gustaría que:

  • heredar el docstring de la clase base
  • tal vez añada documentación adicional relevante a la docstring

¿Hay alguna forma (posiblemente elegante o pitonica) de hacer este tipo de manipulación de docstring en una situación de herencia de clase? ¿Qué tal para la herencia múltiple?


Escribí custom_inherit para proporcionar algunas herramientas simples y ligeras para manejar la herencia de docstring.

También viene con algunos agradables estilos predeterminados para fusionar diferentes tipos de documentos (por ejemplo, Numpy, Google y docstrings formateados reST). También puede proporcionar su propio estilo muy fácilmente.

Las secciones de docstring superpuestas diferirán a la sección del niño, de lo contrario se fusionarán con un buen formato.


No particularmente elegante, pero simple y directo:

class X(object): """This class has a method foo().""" def foo(): pass class Y(X): __doc__ = X.__doc__ + '' Also bar().'' def bar(): pass

Ahora:

>>> print Y.__doc__ This class has a method foo(). Also bar().


Puede concatenar las cadenas de documentos fácilmente:

class Foo(object): """ Foo Class. This class foos around. """ pass class Bar(Foo): """ Bar class, children of Foo Use this when you want to Bar around. parent: """ __doc__ += Foo.__doc__ pass

Sin embargo, eso es inútil. La mayoría de las herramientas de generación de documentación (incluidos Sphinx y Epydoc ) ya van a extraer la docstring principal, incluidos los métodos. Entonces no tienes que hacer nada.


Un estilo mixto que puede conservar tanto la sintaxis de docstring heredada como el orden preferido pueden ser:

class X(object): """This class has a method foo().""" def foo(): pass class Y(X): """ Also bar().""" __doc__ = X.__doc__ + __doc__ def bar(): pass

Con el mismo resultado que el de Alex:

>>> print Y.__doc__ This class has a method foo(). Also bar().

Fino hielo: jugar con docstring puede hacer que tu módulo no se pueda usar con python -OO , espera algo:

TypeError: cannot concatenate ''str'' and ''NoneType'' objects


¡No eres el único! Hubo un debate sobre comp.lang.python sobre esto hace un tiempo, y se creó una receta. Compruébalo 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, 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