为什么可以';我是否直接向任何python对象添加属性?
我有以下代码:为什么可以';我是否直接向任何python对象添加属性?,python,attributes,object,Python,Attributes,Object,我有以下代码: >>> 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.i
>>> 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'
该代码:
>>> 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的实现使用了更好的性能
当使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
时,解释器只为列出的属性保留存储空间,而不为其他属性。这提供了更好的性能和更少的存储空间,但也意味着您不能随意添加新属性
阅读更多信息:它是用C写的
它似乎没有实现setattr。而问题已经得到了回答;如果有人对解决方案感兴趣,下面是一个例子--
Datetime实际上是用C编写的,它的行为与编写使用插槽的python对象非常相似。插槽是用python编写对象的一种方式,几乎与C版本一样高效,而无需求助于cSo。您可以看到这种行为,因为对象是用C编写的,因为它使用setattr,或者因为插槽:-)“我想知道一般的对象。”什么?您展示了一般类的一般示例,该类通常添加了属性。你的编辑是什么意思?这意味着我对所有的课程都很好奇,不仅仅是datetime。我发布这个问题是因为我看到有些类可以添加属性,而有些类不能。@Geo:有些类是不同的——没有“一般”规则。正如你的问题所指出的,有些类可以,有些类不能。既然你的问题表明没有一般规则,你在问什么?这合法吗?(我的意思是,它没有缺点吗?)