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 に答える