强制子类编写文档字符串
Force subclass to write a docstring
我已经实现了一个抽象class:
from abc import ABC, abstractmethod
class Study(ABC):
""" Define the purpose of the study here """
def __init__(self, value):
self.value = value
@abstractmethod
def do_something(self):
pass
我也实现了一个子class:
class PilotStudy(Study):
def do_something(self):
print('Pilot Study')
我想强制 subclass 在 class 定义下面定义一个文档字符串。有没有办法可以做到这一点(这样我在上面定义的 subclass 就会抛出错误,因为 class 中没有文档字符串)?
使用__init_subclass__
。 class 的 __doc__
属性设置为 class 的文档字符串的值;如果没有文档字符串,则该属性设置为 None
.
class Study(ABC):
""" Define the purpose of the study here """
def __init__(self, value):
self.value = value
@abstractmethod
def do_something(self):
pass
def __init_subclass__(cls):
if cls.__doc__ is None:
raise AttributeError("No docstring")
然后
>>> class GoodStudy(Study):
... "Do some stuff"
...
>>> class BadStudy(Study):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<path>/abc.py", line 126, in __new__
cls = super().__new__(mcls, name, bases, namespace, **kwargs)
File "tmp.py", line 16, in __init_subclass__
raise AttributeError("No docstring")
AttributeError: No docstring
我已经实现了一个抽象class:
from abc import ABC, abstractmethod
class Study(ABC):
""" Define the purpose of the study here """
def __init__(self, value):
self.value = value
@abstractmethod
def do_something(self):
pass
我也实现了一个子class:
class PilotStudy(Study):
def do_something(self):
print('Pilot Study')
我想强制 subclass 在 class 定义下面定义一个文档字符串。有没有办法可以做到这一点(这样我在上面定义的 subclass 就会抛出错误,因为 class 中没有文档字符串)?
使用__init_subclass__
。 class 的 __doc__
属性设置为 class 的文档字符串的值;如果没有文档字符串,则该属性设置为 None
.
class Study(ABC):
""" Define the purpose of the study here """
def __init__(self, value):
self.value = value
@abstractmethod
def do_something(self):
pass
def __init_subclass__(cls):
if cls.__doc__ is None:
raise AttributeError("No docstring")
然后
>>> class GoodStudy(Study):
... "Do some stuff"
...
>>> class BadStudy(Study):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<path>/abc.py", line 126, in __new__
cls = super().__new__(mcls, name, bases, namespace, **kwargs)
File "tmp.py", line 16, in __init_subclass__
raise AttributeError("No docstring")
AttributeError: No docstring