1

簡単な例を次に示します。

class KEY(object):
    A = 'a'
    A = 'b'
    B = 'b'

割り当てられた値に関係なく、「A」がクラス「KEY」で繰り返し定義されていることをテストする方法はありますか?

4

2 に答える 2

2

ここに答えの試みがあります:

クラス変数が機能しない

これらの再定義は制御できません。基本的に、はクラスを作成するために呼び出されるもので、 of =>metaclassが渡されます。「もう手遅れ」と言っていいでしょう。dictattributevalue

インスタンス変数の使用

クラスのインスタンス化後に何が起こるかを制御できるa.b = cため、次のことができます。

class RedefinitionMixin(object):
    def __setattr__(self, k, v):
        if hasattr(self, k):
            raise Exception('Attribute redefinition!')
        super(RedefinitionMixin, self).__setattr__(k, v)

class KEY(RedefinitionMixin, object):
    def __init__(self):
        self.A = 'a'
        self.A = 'b'
        self.B = 'b'

__setattr__ただし、すでにオーバーライドしている場合、これにより予期しない動作が発生する可能性があります。

これは、実際にクラスをインスタンス化する場合にのみ機能することに注意してください。インスタンスを使用する際の問題を回避するために、パターン
を実装できます。singleton


全体として、私はその解決策をお勧めしませんが、それは私が今思いつくことができる最高のものです.

于 2012-12-14T17:38:46.570 に答える
2

Python 3 を使用している場合はdict、存在しないキーの設定のみを許可するサブクラスと__prepare__メタクラスのメソッドを使用して、これをきれいに行うことができます。詳細はこちら。Python 2 ではさらに難しくなります。私はそれを達成するための恐ろしいハックを書きましたが、いくつかの制限があります。

于 2012-12-14T18:11:01.427 に答える