0

(すべてActivePython 3.1.2で)

(インスタンスではなく)クラス属性を変更しようとしました。__dict__メタクラスのは完璧な解決策のようでした。しかし、変更しようとすると、次のようになりました。

TypeError:'dict_proxy'オブジェクトはアイテムの割り当てをサポートしていません

なぜ、そして私はそれについて何ができますか?

編集

クラス定義内に属性を追加しています。

setattrクラスがまだ構築されていないために機能しません。したがって、まだ参照できません(または少なくとも方法がわかりません)。

多数の属性を追加しているため、従来の割り当ては機能しません。属性の名前は特定のルールによって決定されます(したがって、単に入力することはできません)。

言い換えれば、私が;を通してclass A属性を持ちたいとしましょう。そして、それらすべてを完全に構築する前に定義する必要があります(そうしないと、SQLAlchemyが適切に計測しないため)。A.a001A.a999

また、元のタイトルでタイプミスをしたことにも注意してください__dict__。変更したいのは、メタクラスではなく、通常のクラスです。

4

3 に答える 3

3

いくつかのルールに従って多数の属性を作成すると、何かが深刻に間違っているように聞こえます。私は戻って、それを行うためのより良い方法がないかどうかを確認します。

ここに「邪悪なコード」があると言った(しかしそれはうまくいくと思う)

class A:
    locals()['alpha'] = 1

print A.alpha

これが機能するのは、クラスが定義されている間、定義しているローカル変数を追跡するディクショナリがあるためです。これらのローカル変数は、最終的にクラス属性になります。必ずしも「正しく」動作するとは限らないため、地元の人には注意してください。あなたは実際に地元の人を変更することになっていないが、私がそれを試したとき、それはうまくいくようだ。

于 2010-09-03T17:24:41.563 に答える
1

宣言型構文を使用する代わりに、テーブルを個別に作成してから、マッパーを使用します。http://www.sqlalchemy.org/docs/05/ormtutorial.html#を参照してください。クラスを定義するときに、計算された属性をクラスに追加する良い方法はないと思います。

または、これが機能するかどうかはわかりませんが、次のようになります。

class A(object):
    pass
A.all_my_attributes = values

class B(declarative_base, A):
   pass 

おそらく動作する可能性があります。

于 2010-09-04T13:38:28.927 に答える
0

3がdictをどのように扱うかについてはあまり詳しくありませんが、次のように辞書クラスを継承するだけで、この問題を回避できる可能性があります。

class A(dict):
 def __init__(self,dict_of_args):
  self['key'] = 'myvalue'
  self.update(dict_of_args)
  # whatever else you need to do goes here...

A()は次のように参照できます。

d = {1:2,3:4}
obj = A(mydict)
print obj['test'],obj[3]  # this will print myvalue and 4

お役に立てれば。

于 2010-09-03T17:54:03.750 に答える