파이썬에서 클래스 상속을 시도하고 있습니다. 각 클래스와 상속 된 클래스가 좋은 독 스트링을 갖기를 바랍니다. 따라서 상속 된 클래스에 대해 다음과 같이하고 싶습니다.
- 기본 클래스 독 스트링 상속
- docstring에 관련 추가 문서를 추가 할 수 있습니다.
클래스 상속 상황에서 이런 종류의 독 스트링 조작을 수행하는 (아마도 우아하거나 비단뱀 같은) 방법이 있습니까? 다중 상속은 어떻습니까?
답변:
당신은 유일한 사람이 아닙니다! comp.lang.python
얼마 전에 이에 대한 논의가 있었고 레시피가 만들어졌습니다. 여기에서 확인 하십시오 .
"""
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
독 스트링을 쉽게 연결할 수 있습니다.
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
그러나 그것은 쓸모가 없습니다. 대부분의 문서 생성 도구 ( Sphinx 및 Epydoc 포함)는 메서드를 포함하여 이미 상위 docstring을 가져옵니다. 따라서 아무것도 할 필요가 없습니다.
특히 우아하지는 않지만 단순하고 직접적입니다.
class X(object):
"""This class has a method foo()."""
def foo(): pass
class Y(X):
__doc__ = X.__doc__ + ' Also bar().'
def bar(): pass
지금:
>>> print Y.__doc__
This class has a method foo(). Also bar().
Init docstring
정의에서 수행하는 방법이 Y
있습니까? 내가 할 수 있었던 유일한 방법 __init__.__doc__ = X.__init__.__doc__ + " Also another param"
은 __init__
정의 를 따르는 Y
것이지만 이것은 서식을 엉망으로 만들어 여분의 공백을 유발하는 것 같습니다.
상속 된 독 스트링 구문과 선호하는 순서를 모두 보존 할 수있는 혼합 스타일은 다음과 같습니다.
class X(object):
"""This class has a method foo()."""
def foo(): pass
class Y(X):
""" Also bar()."""
__doc__ = X.__doc__ + __doc__
def bar(): pass
Alex의 출력과 동일한 출력 :
>>> print Y.__doc__
This class has a method foo(). Also bar().
얇은 얼음 : 독 스트링을 사용하면 python -OO
에서 모듈을 사용할 수 없게 될 수 있습니다 .
TypeError: cannot concatenate 'str' and 'NoneType' objects
나는 custom_inherit를 썼다 상속을 처리하기위한 간단하고 가벼운 도구를 제공하기 위해 를 .
또한 다양한 유형의 독 스트링 (예 : Numpy, Google 및 reST 형식의 독 스트링)을 병합하기위한 멋진 기본 스타일도 제공됩니다. 자신 만의 스타일을 매우 쉽게 제공 할 수도 있습니다.
겹치는 독 스트링 섹션은 자식의 섹션으로 연기됩니다. 그렇지 않으면 멋진 형식으로 병합됩니다.
inspect.getdoc
독 스트링을 찾을 때까지 상속 트리를 검색합니다.