0

我有两个具有通用__init_subclass__()方法的类。检查继承类是否设置了__init_subclass__()一些类变量(但这最终可能是更复杂的代码;我只是想举个例子):

class A():
    def __init_subclass__(cls):
        # Validate required class variables
        required_class_variables = [
            "a",
            "b",
        ]
        for required_class_variable in required_class_variables:
            if not hasattr(cls, required_class_variable):
                raise TypeError(
                    f'Class {cls} lacks `{required_class_variable}` \
                    class attribute'
                )

class B():
    def __init_subclass__(cls):
        # Validate required class variables
        required_class_variables = [
            "a",
            "b",
        ]
        for required_class_variable in required_class_variables:
            if not hasattr(cls, required_class_variable):
                raise TypeError(
                    f'Class {cls} lacks `{required_class_variable}` \
                    class attribute'
                )

当然,A还有B更多的方法,我只是为了最小的例子而省略了。我怎样才能避免代码重复?我不能从一个公共基类创建AB继承并在__init_subclass__ 那里定义它,因为这将强制AB拥有 required_class_variables,而我想要拥有它们的子类AB拥有它们。(即使该基类是抽象基类也是如此。)

有没有办法做到这一点__init_subclass__?或者我最终需要使用元类或类装饰器吗?

4

1 回答 1

0

您可以向 Base 类添加一个静态方法,并分别在__init_subclass__()of和上调用此方法,如下所示:AB

class Base:
    @staticmethod
    def init_subclass(cls):
        required_class_variables = ["a", "b"]
        for required_class_variable in required_class_variables:
            if not hasattr(cls, required_class_variable):
                raise ValueError(
                    f"{cls} lacks required class variable"
                    f"{required_class_variable}!"
                )


class A(Base):
   def __init_subclass__(cls):
       Base.init_subclass(cls)


class B(Base):
   def __init_subclass__(cls):
       Base.init_subclass(cls)
于 2019-05-03T19:07:46.880 回答