[英]How to overwrite abstract method of a child class of a super class, from the inheriting class?
I have a class KA
, which has two methods , add()
and subtract()
, and an abstract child class KAX
. 我有一个
class KA
,它有两个方法 add()
和subtract()
和一个抽象子 class KAX
。 KAX
has an abstract method , multiply()
. KAX
有一个抽象方法 multiply()
。 There is another class KB
which inherits KA
, and by extension has access to KAX.multiply()
. 还有另一个继承自
KA
class KB
,因此可以访问KAX.multiply()
。 I would like to overwrite/define KAX.multiply()
from class KB
. 我想从
class KB
覆盖/定义 KAX.multiply()
。 How to do this? 这个怎么做?
So far what I could think of is define a private method __multiply()
under class KB
, and then redefine under KB.__init__()
as follows: 到目前为止,我能想到的是在
class KB
下定义一个私有方法__multiply()
,然后在KB.__init__()
下重新定义,如下所示:
self.KAX.multiply = self.__multiply()
This works. 这可行。 However, I am wondering if there is a better way to do what I am trying to achieve here.
但是,我想知道是否有更好的方法来完成我在这里想要实现的目标。 Thank you.
谢谢。
My current code: 我当前的代码:
from abc import ABC, abstractmethod
class KA():
def __init__(self):
self.A = 3
self.B = 10
self.C = self.B**self.A
@abstractmethod
def add(self): pass
@abstractmethod
def subtract(self): pass
class KAX(ABC):
@abstractmethod
def multiply(self): pass
class KB(KA):
def __init__(self, A = 3, B = 10):
#super(KB, self).__init__()
self.A = A
self.B = B
self.KAX.multiply = self.__multiply
self.KAX.multiply()
self.C = self.KAX.multiplication
def add(self):
self.addition = self.A + self.B
def subtract(self):
self.subtraction = self.A - self.B
def __multiply(self):
self.KAX.multiplication = self.A*self.B
if __name__ == '__main__':
kb = KB(A = 4, B = 2)
# check values of variables: A, B, C
print('Parameters: A, B, C')
print(''.join(['kb.{}: {}\n'.format(vname, getattr(kb,vname)) for vname in ['A', 'B', 'C']]))
# apply methods
kb.add()
kb.subtract()
kb.KAX.multiply()
# show results
result_string = 'Result: \n\t addition: {}\t | subtraction: {}\t | multiplication: {}'
print(result_string.format(kb.addition, kb.subtraction, kb.KAX.multiplication))
The output of this code results in: 该代码的输出结果为:
Parameters: A, B, C
kb.A: 4
kb.B: 2
kb.C: 1000
Result:
addition: 6 | subtraction: 2 | multiplication: 8
KAX
isn't a child class, it's just a class defined within another class . KAX
不是子类,它只是在另一个类中定义的类 。 So, you can subclass it and override its methods: 因此,您可以将其子类化并覆盖其方法:
class KB(KA):
class KAX(KA.KAX):
def multiply(self):
print("hello!")
Maybe you could try making a new class called KB.KAX that extends KA.KAX and then implementing your method like so: 也许您可以尝试创建一个名为KB.KAX的新类,该类扩展了KA.KAX,然后像这样实现您的方法:
class KA():
class KAX():
@abstractmethod
def multiply(self): pass
class KB(KA):
class KAX(KA.KAX):
def multiply(self):
print("doing stuff")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.