私は複数のサブクラスを派生させた基本クラスを持っています。
各サブクラスはクラス定数を定義しており、それらに対して一定の制限を適用したいと考えています。たとえば :派生時の自動クラス装飾(または検証)
class Base(object):
# define these in your sub-class, and make sure (NOM % DENOM == 0)
NOMINATOR = None
DENOMINATOR = None
class Subclass_good(Base):
NOMINATOR = 6
DENOMINATOR = 3
class Subclass_bad(Base):
NOMINATOR = 7
DENOMINATOR = 5
は私がルール(NOM%のDENOM == 0)を強制することができるようにしたいです。
私は現在、クラスのデコレータでこれを行う:
def nom_denom_validator(cls):
assert(cls.NOMINATOR % cls.DENOMINATOR == 0)
return cls
# and decorate each subclass, e.g.:
@nom_denom_validator
class Subclass_another(Base):
NOMINATOR = 9
DENOMINATOR = 12
しかし、私は(私はたくさん持っている)各サブクラスを飾るために必要があるという事実が好きではありません。私はこれが基本クラスのいくつかの操作によって直接行うことができるかどうか興味があります。
アドバイスはありますか?あなたがSubclass_bad()
のインスタンスを作成するときに、あなたがAssertionError
を得るでしょう
class Base(object):
# define these in your sub-class, and make sure (NOM % DENOM == 0)
NOMINATOR = None
DENOMINATOR = None
def __init__(self):
assert(self.NOMINATOR % self.DENOMINATOR == 0)
あなたがクラスレベルの振る舞いを継承したい場合は、メタクラスが必要です。継承したくない場合は、クラスデコレータが必要です。 – Steve