当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能直接向任何python对象添加属性?

如何解决《为什么我不能直接向任何python对象添加属性?》经验,为你挑选了2个好方法。

我有这个代码:

>>> 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.我总是想知道对象.



1> Epcylon..:

我的猜测是,datetime的实现使用__slots__以获得更好的性能.

使用时__slots__,解释器仅为列出的属性保留存储空间,而不保留其他内容.这样可以提供更好的性能并减少存储空间,但这也意味着您无法随意添加新属性.

在这里阅读更多内容:http://docs.python.org/reference/datamodel.html


Datetime实际上是用C语言编写的,它的行为与编写使用__slots__的python对象非常相似.插槽是一种在python中编写对象的方法,几乎​​与C版本一样高效,而不需要使用c
所以你可以看到行为,因为对象是用c编写的,因为它使用setattr,或者因为插槽:-)

2> S.Lott..:

它是用C语言编写的

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

它似乎没有实现setattr.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有