Bạn không phải là người duy nhất! Đã có một cuộc thảo luận về comp.lang.python
về điều này một thời gian trước đây và một công thức đã được tạo. Kiểm tra xem nó ra 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
Nguồn
2010-01-08 04:51:35
Đó là gọn gàng để có phương pháp kế thừa chuỗi tài liệu của phương thức lớp cha. Điều đó sẽ hữu ích trong nhiều trường hợp tôi nghĩ. Tôi đã suy nghĩ nhiều hơn về docstring cho cả lớp, nơi tôi muốn kế thừa và nối thêm. –
Ah, gotcha. Trong trường hợp đó, hầu hết các thế hệ doc đã làm điều đó cho bạn. –