0

我有一个抽象类ship

from abc import ABC, abstractmethod
class ship(ABC):
    def __init__(self):
         ...

    @abstractmethod
    def do_stuff(self,stuff,things):
         pass

我有多个继承自它的类(destroyer, cruiser, patrol_boat, 等等...)

class carrier(ship):
    def __init__(self):
         ....
    def do_stuff(self,stuff,things):
         ....

目前,如果我要添加,让我们def do_more_stuff(self):ship

class ship(ABC):
    def __init__(self):
         ...

    @abstractmethod
    def do_stuff(self,stuff,things):
         pass

    @abstractmethod
    def do_more_stuff(self,stuff,things):
        pass

在我将它们重新输入控制台之前,这些更改不会影响任何子类。我该如何改变?

4

1 回答 1

1

如果你真的从头开始重新定义一个类,它就是一个不同的类;子类仍然继承自旧版本的ship. 您不能只定义一个名为的新类ship并期望子类神奇地找到它。

通常,如果您想ship在创建后进行猴子补丁以添加新方法,您可以执行以下操作:

def do_more_stuff(self,stuff,things):
    pass
ship.do_more_stuff = do_more_stuff

但不幸的是,abstractmethods for ABCs是这条规则的明确例外

不支持向类动态添加抽象方法,或在方法或类创建后尝试修改其抽象状态。

如果要向基类添加新的抽象方法,则必须预先完全定义抽象基类,或者稍后重新定义整个类层次结构。

于 2016-12-09T02:18:38.343 回答