【问题标题】:Use __init_subclass__ for implementation checking使用 __init_subclass__ 进行实现检查
【发布时间】:2019-08-31 19:04:24
【问题描述】:

我有一个项目,其中有一个基类和一堆派生类。真的主要是为了确保我不会忘记任何我想要实施的东西,以进行某种方法实现检查。我想知道这是否有意义,以及继承是否存在任何潜在冲突。

class Base:
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__()
        for prop in ['prop_to_check']:  # extend this list for additional properties to check
            if not hasattr(cls, prop):
                raise NotImplementedError(f'{prop} is not implemented on {cls.__name__}')

class Derived(Base):
    prop_to_check = 3
    pass

class Derived2(Base):
    pass

Derived() 
Derived2()

干杯 费边

【问题讨论】:

  • 有什么理由不使用abc 模块?
  • 这可能不是一个很好的理由 :) 先看过一个关于 init_subclass 的视频 :D

标签: python init metaclass


【解决方案1】:

唯一的缺点是可读性。要子类化您的类,必须阅读(并理解)__init_subclass 函数。另一方面,你可以写

class Base(abc.ABC):

   @abc.abstractproperty
   def x(self):
       """children MUST implement this"""

【讨论】:

  • 似乎确实更容易。如果 Base 有额外的功能会怎样?我的 Base 是否必须派生自我们称之为 ABC_Base 类?还是应该从 ABC_Base 派生孩子?
  • 您要实例化基类吗?或者只是实现一些要继承的方法?
  • 不,基类不会被实例化。后者是这样,有些方法要被继承。
  • 然后它就像任何其他语言的抽象类一样工作。你可以实现了方法,但你不能实例化它。你只实例化实现抽象的子类
  • 谢谢,我会调查的!方法、类属性和属性的装饰器是否相同?即类 Base(abc.ABC): x = 3 def x(self): return 4 @property def x(self): return 5
猜你喜欢
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2013-11-11
  • 2019-07-21
相关资源
最近更新 更多