pythonオブジェクトに属性を直接追加できないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/623520

  •  05-07-2019
  •  | 
  •  

質問

次のコードがあります:

>>> class G:
...   def __init__(self):
...     self.x = 20
...
>>> gg = G()
>>> gg.x
20
>>> gg.y = 2000

そしてこのコード:

>>> from datetime import datetime
>>> my_obj = datetime.now()
>>> my_obj.interesting = 1
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting'

Pythonの知識から、 datetime setattr / getattr をオーバーライドすると言いますが、わかりません。ここで光を当ててもらえますか?

編集: datetime には特に興味がありません。一般的なオブジェクトについて疑問に思っていました。

役に立ちましたか?

解決

私の推測では、datetimeの実装では、パフォーマンスを向上させるために __slots__ を使用しています。 。

__ slots __ を使用する場合、インタープリターはリストされた属性のみのストレージを予約し、それ以外は何も行いません。これにより、パフォーマンスが向上し、使用するストレージが少なくなりますが、新しい属性を自由に追加できないことも意味します。

詳細はこちら: http://docs.python.org/reference/datamodel.html

他のヒント

Cで書かれています

http://svn.python.org/ view / python / trunk / Modules / datetimemodule.c?view = markup

setattrを実装していないようです。

質問には既に回答済みですが、誰かが回避策に興味があるなら、ここに例があります-

mydate = datetime.date(2013, 3, 26)
mydate.special = 'Some special date annotation'  # doesn't work
...
class CustomDate(datetime.date):
    pass
mydate = datetime.date(2013, 3, 26)
mydate = CustomDate(mydate.year, mydate.month, mydate.day)
mydate.special = 'Some special date annotation'  # works
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top