Python 3:两个带有共同的__init_subclass __()的类

时间:2019-05-03 18:56:52

标签: python-3.x oop metaprogramming

我有两个具有通用__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'
                )

当然,AB有更多的方法,为简单起见,我只是省略了它们。我如何在这里避免代码重复?我无法使AB从一个公共基类继承并在那里定义__init_subclass__,因为这将迫使AB具有required_class_variables,而我想拥有AB的子类来拥有它们。 (即使该基类是Abstract Base Class,也是如此。)

有没有一种方法可以使用__init_subclass__来实现?还是最后需要使用元类或类装饰器?

1 个答案:

答案 0 :(得分:0)

您可以向基类中添加静态方法,并分别在__init_subclass__()A的{​​{1}}上调用此方法,如下所示:

B