【问题标题】:Force subclass to write a docstring强制子类编写文档字符串
【发布时间】:2019-12-12 20:35:04
【问题描述】:

我已经实现了一个抽象类:

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 PilotStudy(Study):

   def do_something(self):
      print('Pilot Study')

我想强制子类在类定义下面定义一个文档字符串。有没有办法我可以做到这一点(这样我上面定义的子类会抛出错误,因为该类中没有文档字符串)?

【问题讨论】:

    标签: python inheritance abstract-class


    【解决方案1】:

    使用__init_subclass__。类的__doc__ 属性设置为类的文档字符串的值;如果没有文档字符串,则属性设置为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
    

    【讨论】:

    • 该死,我可以发誓 cls.__doc__ 不会是 None 而是继承。我现在就去找一个棕色的包包穿。这样一个基本的事情要忘记:-P
    • 也许会在 Winter Bash 中弹出一个 :)
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2011-10-06
    • 2019-07-06
    相关资源
    最近更新 更多