我的项目有一个继承问题,我不确定该如何解决。我有一个类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。我该如何解决这个问题?
将基类的业务逻辑放在带有双下划线的“私有”方法中,并添加具有调用它们的原始名称的包装器方法。
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?。>>