4


複数のサブクラスを派生させる基本クラスがあります。
各サブクラスはクラス定数を定義しており、それらに特定の制限を適用したいと考えています。例えば:

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

しかし、各サブクラスを装飾する必要があるという事実は好きではありません (たくさんあります)。Base クラスを直接操作することでこれを実行できるかどうかに興味があります。

何かアドバイス?

4

2 に答える 2

8

わかりました、面白いです。しばらく考えていましたが、質問を投稿した後、特にタグを選択し、そこに「メタクラス」を追加するときに、自分で答えがあるかもしれないことに気付きました。
したがって、レビューと将来の知識のために提出されたものは次のとおりです。

class Base_Metaclass(type):
    def __new__(meta, classname, bases, class_dict):
        new_type = type.__new__(meta, classname, bases, class_dict)
        if not (new_type.NOMINATOR % new_type.DENOMINATOR) == 0:
            raise Exception("Invalid subclass created - validation failed")
        return new_type

# have Base and all its descendants be enforced:
class Base(object):
    __metaclass__ = Base_Metaclass
    # I must pass the validation myself, no None's anymore...
    NOMINATOR = 1
    DENOMINATOR = 1

そして今、すべての子が自動適用されるはずです。

于 2010-12-20T13:36:33.120 に答える
1

基本クラスのコンストラクターでチェックを行うことができます

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)

のインスタンスを作成するとSubclass_bad()、 が得られますAssertionError

于 2010-12-20T13:35:43.913 に答える