6

このようなクラスインスタンスを作成すると

class MyClass(object):
    pass
x = MyClass()

次に、次のように x に属性を設定できます。

x.myAttr = 1またx.__setattr__('myAttr', 1)

ただし、口述を行う場合

d = {}

属性を設定できません。たとえば、これを行うと

d.__setattr__('myAttr', 1)

「「dict」オブジェクトには属性「myAttr」がありません」というエラーが表示されます。試しても同じことが起こります

d.myAttr = 1

x.myAttr = 1 の場合、実際に何が起こるかということに気付きました

x.__dict__

新しいキーで更新されるため、その必要があります

d.__setattr__

d がないため機能しません

d.__dict__

単に ddict だからです。誰かがここで何が起こっているのかを完全に説明できれば幸いです。

すべての python オブジェクトには があり.__dict__ますか?

呼び出しを試みるとd.__setattr__、属性が存在しないというエラーが発生するのはなぜですか?

知っておくべき組み込み型の特定の階層はありますか? 簡単な参考になれば幸いです。

パイソン2.6.4

Windows XP Pro x64 SP2

4

5 に答える 5

5

dictインスタンスには属性がないため、属性__dict__を割り当てることはできません。Python の組み込みクラス (C で記述され、属性の定義が異なる) のほとんどは、そうではありません。をサブクラス化する場合dict、サブクラスには__dict__属性があり、サブクラスのインスタンスに属性を追加できます。

于 2012-06-05T17:51:12.370 に答える
3

docs.python.orgからのコピーアンドペースト:

すべてのモジュールの特別な属性は__dict__です。これは、モジュールのシンボルテーブルを含む辞書です。このディクショナリを変更すると、実際にはモジュールのシンボルテーブルが変更されますが、__ dict__属性に直接割り当てることはできません(maを1と定義するm .__ dict __ ['a'] = 1と書くことはできますが、書くことはできません。 m .__ dict__ = {})。__dict__を直接変更することはお勧めしません。

http://docs.python.org/library/stdtypes.html

方法

どちらの行も同じです。

x.__setattr__('a', b)
x.a = b

__add__のように:

x.__add__(b)
x + b

ただし、dict.__setattr__関数を任意に再定義できます。

3番目のコメントの編集:

class x(object):
    def __init__(self):
        pass
    def __setattr__(self, a, b):
        print "nope, i will not set the attribute %s = %s" % (a,b)

c = x()
c.a = 4
print c.__dict__

「いいえ、属性a = 4を設定せc.__dict__ず、属性'a'を持たない」と出力されます。

于 2012-06-05T17:43:40.310 に答える
1

例外の説明:

>>> class C(object):
...     __slots__ = ('a', 'b')
... 
>>> c = C()
>>> c.a = 1
>>> c.t = 2
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'C' object has no attribute 't'

ここで説明するスロット

于 2012-06-05T17:43:30.810 に答える
0

もしそうならx.myAttr = 1、あなたは本当にやっていx.__dict__['myAttr'] = 1ます。その場合x.__dict__.myAttr、 と同じエラーが発生しd.myAttrます。。attribute割り当てはクラスに対して定義されますが、辞書では定義されません-辞書の割り当てはd['attribute']代わりに経由されます。

于 2015-10-27T15:31:26.623 に答える