在Python中,可写和可变之间有什么区别

时间:2015-07-27 17:31:46

标签: python oop object

该文件说明了__dict__

object.__dict__

用于存储对象(可写)属性的字典或其他映射对象。

所以我的问题是,如何确定一个对象是否是一个可写对象,以及可写和可变之间有什么区别。

这是代码

num = 1
num.__dict__
AttributeError: int object has no attribute __dict__

class MyClass(object):
    pass
myclass = MyClass()
myclass.__dict__
{}

2 个答案:

答案 0 :(得分:0)

状态可以更改的对象是可变的。写入属性会改变状态。因此,任何具有“可写”属性的对象都是可变的。

但是有些对象的属性是你无法改变的,但仍然是可变的。例如,取threading.Lock。您可以acquirerelease一个Lock。这些方法会更改Lock的状态,但您无法写入其属性。

答案 1 :(得分:0)

没有通用的方法来确定对象是否可写。

并非每个对象都有一个可写的__dict__成员。

有些课程使用__slots__;这会将对象的字段和属性限制为列表中定义的字段和属性。

其他类会覆盖 getattribute setattribute ,以防止用户访问这些类;这在CPython的C语言扩展中要容易得多。

总的来说,判断类是否可写的最简单方法是获取它的实例并在try-catch块中调用setattr(obj, "xfoo", 1)