19

次のようなクラスがあるとします。

class Alphabet(object):
     __init__(self):
         self.__dict = {'a': 1, 'b': 2, ... 'z': 26}

     @property
     def a(self):
         return self.__dict['a']

     @property
     def b(self):
         return self.__dict['b']

     ...

     @property
     def z(self)
         return self.__dict['z']

これを定義するのは長くて面倒な作業であり、非常に冗長に思えます。これらのプロパティを動的に作成する方法はありますか? 組み込みの setattr を使用して属性を動的に作成できることは知っていますが、読み取り/書き込み/削除アクセスを制御したい (このため、プロパティを使用したい)。ありがとう!

4

2 に答える 2

37

プロパティを使用せずに、次のメソッドを実装します。

  • __getattr__(self, name)
  • __setattr__(self, name, value)
  • __delattr__(self, name)

http://docs.python.org/reference/datamodel.html#customizing-attribute-accessを参照してください

メソッド__getattr__は次のようになります。

def __getattr__(self, name):
    try:
        return self.__dict[name]
    except KeyError:
        msg = "'{0}' object has no attribute '{1}'"
        raise AttributeError(msg.format(type(self).__name__, name))
于 2012-06-10T09:26:05.813 に答える
-1

そうしないでください。クラスの消費者に直接任せて、__dictそれを台無しにしないように信頼してください。覚えておいてください、私たちはここにいるすべての大人に同意しています!

Ned Batchelder は、私ができるよりもうまく説明しています。


変数名にデータを含めないでください

この質問は、スタック オーバーフローや #python IRC チャンネルで見た他のものを思い出させました。

  • 変数が存在するかどうかを確認するにはどうすればよいですか?
  • 変数を別の変数の名前として使用するにはどうすればよいですか?
  • SQL テーブル名の一部として変数を使用するにはどうすればよいですか?

これらすべてに共通しているのは、プログラム内のデータとプログラム内のデータの名前という 2 つのドメイン間のギャップを埋めようとすることです。これが発生した場合は常に、データ モデリングのレベルを上げる必要があることを明確に示しています。26 個のリストの代わりに、1 つの辞書が必要です。N 個のテーブルの代わりに、1 つのテーブルを作成し、その中にもう 1 つの列を追加する必要があります。

于 2012-06-10T10:07:42.953 に答える