当我做一些与oop相关的事情时,我才想到这件事。 如果我有这样的课程:
>>> class foo(object):
def __init__(self):
pass
现在我们可以为foo
实例设置任何随机属性,如下所示:
>>> a=foo()
>>> a.any_attribute="any-value"
但为什么我们不能为其他python结构对象(如list或dict对象)执行此操作:
>>> l=[1,2,3,4]
>>> l.some_attribute="any-value"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'some_attribute'
我试图理解这背后的逻辑和观点。我的解释是这样的: -
由于所有python对象都有__setattr__
方法,这些方法都是从Object
基类继承的。我们使用语法a.any_attribute="any-value"
设置python对象的属性,__setattr__
方法被调用。由于我的foo()
,foo
类的实例没有限制只设置预定义的属性,因此可以自由设置任何属性。
但是对于列表和其他数据结构对象,__setattr__
方法必须有一些覆盖行为,只允许设置预定义属性。
我是对的吗? 如果我是对的,那么这背后的基本语义是什么。为什么我们不允许为这些类型的对象设置任何随机属性。 如果允许这种行为,是否有任何缺点或违反基本的python信念?
我知道在某些方面我可能错了但是因为这个问题听起来很有趣,所以我问道。 问候。
编辑 - 好的,我理解答案,这个类应该有__dict__
方法向其实例添加任何随机属性。但是,主要的问题是
如果允许这种行为,是否有任何缺点或违反基本的python信念?