我希望我的超级类仅在Python中访问超级方法

问题描述 投票:1回答:1

我的项目有一个继承问题,我不确定该如何解决。我有一个类B,它是类A的子类,它覆盖了类A的所有方法。但是有时我希望类B使用其方法的超级版本,可以使用super(type(B),B).method1()来完成。但是,如果有问题的方法调用了该类中的另一个方法,即IE method1(),它将调用重写的method2()而不是超级版本。在下面的示例中,如果我调用super(type(B),B).method1(),它将返回2,但是我希望它返回1。是否有解决此问题的简单方法?

class A:
   def testMethod():
      test_obj = C
      return test_obj.method3()

   def method1():
      return self.method2()

   def method2():
     return 1

   class C:
       def method3():
           return 3

class B(A):
   def testMethod():
      test_obj = C
      return test_obj.method3()

   def method1():
      return self.method2()

   def method2():
      return 2

   class C(A.C):
       def method3():
           return 4

我遇到的唯一解决方案是对调用类进行类型检查,如果不是,则调用该方法的超版本的超类类型。

if (not isinstance(A, self)): return super(type(self), self).method2()
else: return self.method2()

但是对于每种方法都这样做似乎是不好的编码习惯。建议将不胜感激!

编辑:我添加了一些内部类。当我调用super(type(B),B).testMethod()时,我希望输出为super类中定义的3,但结果将为4。我该如何解决这个问题?

python inheritance polymorphism super virtual-functions
1个回答
0
投票

将基类的业务逻辑放在带有双下划线的“私有”方法中,并添加具有调用它们的原始名称的包装器方法。

class A:
   def method1(self):
      return self.__method2()

   def __method2(self):
     return 1

   def method2(self):
      return self.__method2()

class B(A):
   def method1(self):
      return self.method2()

   def method2(self):
      return 2

关于Dunder方法的特殊处理,请参见What is the meaning of a single and a double underscore before an object name?。>>

© www.soinside.com 2019 - 2024. All rights reserved.