クラスの特定のメソッドの定義を強制するのに役立つ次のコードを作成しました。
def createClassTemplate(name, requiredMethods=[], inherits=object):
def require(name):
def errorRaiser(self, *args, **kwargs):
raise RequireException("method '{}' must be defined.".format(name))
setattr(wrapper, "__name__", name)
return errorRaiser
class Custom(inherits): pass
setattr(Custom, "__name__", name)
for methodName in requiredMethods:
setattr(Custom, methodName, require(methodName))
return Custom
これは次のように実装されています:
Model = createClassTemplate("Model", ["foo", "bar", "baz"])
class MyClass(Model):
pass
このようにして、メソッドが欠落している場合、呼び出し元のクラスは、必要なメソッドの定義に失敗したことを示す意味のあるエラーを生成します。
問題は、上記のコードが不快なほどハッキーで非 Pythonic であるように見えることです。私はこれを正しい方法で行っていますか?このようなクラス テンプレートを強制する必要がありますか? そして、同じことを達成するためのより良い方法はありますか?