简体   繁体   English

如何从继承类覆盖父类的子类的抽象方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM