【问题标题】:Python: check the order of classes in multiple inheritancePython:检查多重继承中类的顺序
【发布时间】:2013-05-02 09:48:18
【问题描述】:

在我的框架中,我必须确保当一个类从 ClassA 继承时,它也必须从 ClassB 继承,ClassB 跟在 ClassA 之后(为了使被覆盖的方法[在 Django 形式中] 起作用)。例如

class MyClass(ClassA, ClassB) --> correct

class MyClass(ClassA) --> wrong

class MyClass(ClassB, ClassA) --> wrong

有没有办法让 ClassA 检查它是否跟在 ClassB 后面(在启动时或运行时)?

【问题讨论】:

    标签: python django inheritance multiple-inheritance method-resolution-order


    【解决方案1】:

    提供一个使用正确顺序的ClassC,而不是要求特定的继承顺序

    class ClassC(ClassA, ClassB):
    

    可以使用元类验证基类,但如果使用简单的基类就可以做到这一点。 ClassA 上的元类也会被 ClassA 的子类调用,然后您只需测试 bases 参数以获得正确的顺序。

    【讨论】:

      【解决方案2】:

      在定义类之后有一种方法可以做到这一点。它使用mro() 方法。 如果你有这样的事情

      class A(object):
          pass
      
      class B(object):
          pass
      
      class C(A,B):
          pass
      

      如果您打印mro 的输出,您会得到以下结果。

      print(A.mro(), B.mro(), C.mro())
      ([<class '__main__.A'>, <type 'object'>], 
      [<class '__main__.B'>, <type 'object'>], 
      [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>])
      

      一种方法可能是:

      if C.mro()[1] == A.mro()[0] and C.mro()[2] == B.mro()[0]:
          go ahead
      else:
          raise Exception
      

      【讨论】:

        猜你喜欢
        • 2016-08-09
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        相关资源
        最近更新 更多