簡単な例を次に示します。
class KEY(object):
A = 'a'
A = 'b'
B = 'b'
割り当てられた値に関係なく、「A」がクラス「KEY」で繰り返し定義されていることをテストする方法はありますか?
簡単な例を次に示します。
class KEY(object):
A = 'a'
A = 'b'
B = 'b'
割り当てられた値に関係なく、「A」がクラス「KEY」で繰り返し定義されていることをテストする方法はありますか?
ここに答えの試みがあります:
これらの再定義は制御できません。基本的に、はクラスを作成するために呼び出されるもので、 of =>metaclass
が渡されます。「もう手遅れ」と言っていいでしょう。dict
attribute
value
クラスのインスタンス化後に何が起こるかを制御できる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
全体として、私はその解決策をお勧めしませんが、それは私が今思いつくことができる最高のものです.
Python 3 を使用している場合はdict
、存在しないキーの設定のみを許可するサブクラスと__prepare__
メタクラスのメソッドを使用して、これをきれいに行うことができます。詳細はこちら。Python 2 ではさらに難しくなります。私はそれを達成するための恐ろしいハックを書きましたが、いくつかの制限があります。