首页 > python内置类和自定义类不同的机制是如何做到的?

python内置类和自定义类不同的机制是如何做到的?

为什么在python中str类的对象不能动态添加属性,而自定义的类的对象却可以?可以结合str的源码解释一下吗?谢谢!


python 代码里面使用一个 PyTypeObject 结构体来存放一个类型的各种数据,包括这个类型的名称,比如内置类型string 就是 'str' 来表示,以及这个类型的各种接口列表。如果有一个类,当执行 test_obj.key = value 这样的代码时,会先检查 test_obj 这个 instance 是否有一个成员为 key,当然这个检查是查一个 dict,如果有,则更新它的值就行了,如果没有,就看是否有支持 setattr,什么意思呢,相当于 PyTypeObject 里面有一个函数指针,比如名字就叫 setattr,如果它不为空,就调用 setattr(test_obj, key, value),这样就完成了在 dict 中动态添加一个属性的操作。而内置 str 类型,它在 python 内部 C 代码中的表示同样是一个 PyTypeObject,只不过它的 setattr 函数指针是 0,所以就不支持动态添加。我们自定义的类来讲,都是继承自 Object,而这个 Object 其实是有 setattr 这个函数指针的。所以他是支持的。更多详细请参考 https://docs.python.org/2/c-api/typeobj.html 或 python 代码 Objects/typeobject.c,Objects/classobject.c Objects/stringobject.c


要禁止动态添加属性,只要在 __setattr__ 中抛出异常即可。

【热门文章】
【热门文章】