pythonオブジェクトに属性を直接追加できないのはなぜですか?
-
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 __
を使用する場合、インタープリターはリストされた属性のみのストレージを予約し、それ以外は何も行いません。これにより、パフォーマンスが向上し、使用するストレージが少なくなりますが、新しい属性を自由に追加できないことも意味します。
他のヒント
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
所属していません StackOverflow