私はプラグイン フレームワークを作成してinterface
いますが、ユーザー クラスを ABC クラスに変換し、すべてのメソッドを抽象メソッドに置き換えるデコレータを作成できるようにしたいと考えています。問題が間違ったmroに関連していると思いますが、間違っている可能性があります。
私は基本的に書くためにalbeである必要があります:
@interface
class X:
def test(self):
pass
x = X() # should fail, because test will be abstract method.
メソッドを抽象バージョンに置き換えるのは簡単です ( func を反復処理して に置き換える必要があります) が、メタクラスabc.abstractmethod(func)
になる動的型の作成に問題があります。ABCmeta
今、私は次のようなものを持っています:
from abc import ABCMeta
class Interface(metaclass=ABCMeta):
pass
def interface(cls):
newcls = type(cls.__name__, (Interface, cls), {})
# substitute all methods with abstract ones
for name, func in inspect.getmembers(newcls, predicate=inspect.isfunction):
setattr(newcls, name, abstractmethod(func))
return newcls
しかし、それは機能しません - クラス X をエラーなしで初期化できます。
Python で ABC を標準的に使用すると、次のように記述できます。
class X(metaclass=ABCMeta):
@abstractmethod
def test(self):
pass
x = X() # it will fail
ABCmeta
メタクラスを持つように動作し、すべての関数を抽象関数に置き換えるPython3で動的型を作成するにはどうすればよいですか?