これによりエラーが発生するのはなぜですか。
o = object()
o.i = 1
しかし、これはしません:
class A(object):
pass
a = A()
a.i = 1
?
これによりエラーが発生するのはなぜですか。
o = object()
o.i = 1
しかし、これはしません:
class A(object):
pass
a = A()
a.i = 1
?
組み込み型には、追加された属性を保持するための辞書が関連付けられていないため、次のようになります。
>>> o = object()
>>> dir(o)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
見る?いいえ__dict__
。
しかし、サブクラスを追加すると、属性がどこかに移動します:
>>> class A(object):
.... pass
....
>>> a = A()
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
「Cで定義されているから」というのは「理由」ではありません。インスタンス ディクショナリを使用して、C で型を定義できます。
object
は C で定義されています。型定義の適切なスロットを埋めない限り、C で定義された型のインスタンスに任意の属性を追加することはできません。