3

ユーザーがフレームワーク スタイルの設定で作成できるクラスを検証しようとしています。次の方法で、クラス属性が子クラスに存在することを確認できます。

from abc import ABC, abstractmethod

class A(ABC):
    @property
    @classmethod
    @abstractmethod
    def s(self):
        raise NotImplementedError

class ClassFromA(A):
    pass


ClassFromA()

これは以下につながりますException

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class ClassFromA with abstract methods s

s次のように、クラスの作成時にデコレーターを使用してクラス属性の型を確認することもできます。

from abc import ABC, abstractmethod

def validate_class_s(cls):
    if not isinstance(cls.s, int):
        raise ValueError("S NOT INT!!!")
    return cls

class A(ABC):
    @property
    @classmethod
    @abstractmethod
    def s(self):
        raise NotImplementedError

@validate_class_s
class ClassFromA(A):
    s = 'a string'

その結果:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 3, in validate_class_s
ValueError: S NOT INT!!!

これは、クラス属性の最終的なチェックに役立ちます。しかし、これは、各子クラスを装飾する必要がある冗長なクラス定義につながります。

s基本クラスのクラス属性 (例)を検証する方法はありますか? あまり冗長な方法ではありませんか?

4

2 に答える 2