该文件说明了__dict__
:
object.__dict__
用于存储对象(可写)属性的字典或其他映射对象。
所以我的问题是,如何确定一个对象是否是一个可写对象,以及可写和可变之间有什么区别。
这是代码
num = 1
num.__dict__
AttributeError: int object has no attribute __dict__
class MyClass(object):
pass
myclass = MyClass()
myclass.__dict__
{}
答案 0 :(得分:0)
状态可以更改的对象是可变的。写入属性会改变状态。因此,任何具有“可写”属性的对象都是可变的。
但是有些对象的属性是你无法改变的,但仍然是可变的。例如,取threading.Lock
。您可以acquire
和release
一个Lock
。这些方法会更改Lock
的状态,但您无法写入其属性。
答案 1 :(得分:0)
没有通用的方法来确定对象是否可写。
并非每个对象都有一个可写的__dict__
成员。
有些课程使用__slots__
;这会将对象的字段和属性限制为列表中定义的字段和属性。
其他类会覆盖 getattribute 和 setattribute ,以防止用户访问这些类;这在CPython的C语言扩展中要容易得多。
总的来说,判断类是否可写的最简单方法是获取它的实例并在try-catch块中调用setattr(obj, "xfoo", 1)
。