强制子类编写文档字符串

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