Python 如何创建只读插槽?
默认情况下,插槽是可写的:Python 如何创建只读插槽?,python,super,slots,readonly-attribute,Python,Super,Slots,Readonly Attribute,默认情况下,插槽是可写的: >>A类:uuuuu插槽uuu=('x',) ... >>>清单(vars(A)) [“模块”、“插槽”、“x”、“文档”] >>>vars(A)['x'] >>>a=a() >>>a.x='foo' >>>德尔a.x 如何创建只读插槽,如类的插槽“\uuuuuThisClass\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”,和超级的插槽 >列表(变量(超级
>>A类:uuuuu插槽uuu=('x',)
...
>>>清单(vars(A))
[“模块”、“插槽”、“x”、“文档”]
>>>vars(A)['x']
>>>a=a()
>>>a.x='foo'
>>>德尔a.x
如何创建只读插槽,如类的插槽“\uuuuuThisClass\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”
,和超级的插槽
>列表(变量(超级))
[“报告”、“获取属性”、“获取”、“初始化”、“新建”,
"本课程","自我","自我","课程","文档"
>>>vars(超级)[“本类”]
>>>s=超级(整数,123)
>>>s.\uuuu此类=浮动
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:只读属性
>>>本班学生__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:只读属性
您不能,Python代码中没有创建只读描述符的选项,例如用于\uuuuuuu this类的描述符等
在C API中,插槽都使用相同的描述符对象类型,对于标志设置为READONLY
的项目,这些描述符对象类型将变为只读
例如,您识别的super
描述符定义在:
static PyMemberDef super_成员[]={
{“\uuuu this class\uuuu”,T\u对象,偏移量(超对象,类型),只读,
“调用super()的类”},
{uuuu self_uuu',T_OBJECT,offsetof(superobject,obj),只读,
“调用super()的实例;可能为None”},
{“\uuuu self\u class\uuuu”,T\u对象,offsetof(超对象,对象类型),只读,
调用super()的实例的类型;可能为None“},
{0}
};
当处理\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
时,没有可以设置此标志的路径;分别是名称
、类型
和偏移量
:
mp=PyHeapType\u GET\u成员(et);
Slotofset=base->tp_basicsize;
如果(et->ht\U插槽!=NULL){
对于(i=0;iname=PyUnicode\u AsUTF8(
PyTuple_GET_项目(et->ht_插槽,i));
如果(mp->name==NULL)
转到错误;
mp->type=T\u OBJECT\u EX;
mp->offset=slotofset;
/*dict和weakref已经被过滤掉了*/
断言(strcmp(mp->name,“\u dict”!=0);
断言(strcmp(mp->name,“\uu weakref”!=0);
slotofset+=sizeof(PyObject*);
}
}
供参考:
PyHeapType_GET_MEMBERS
访问正在创建的新类型对象的PyMemberDef
数组。它已经分配了正确数量的插槽
et->ht\u slots
是插槽名称的元组
slotofset
是实例对象内存区域中存储插槽内容的相对偏移量
type
字段的T\u OBJECT\u EX
值意味着插槽存储指向Python对象的指针,如果指针设置为NULL
则在尝试获取该值时会引发AttributeError
请注意,如果可以将这些插槽设置为只读,那么在创建新实例之前还需要一种机制来提供它们的值!毕竟,如果所有Python代码都被阻止在实例上设置只读属性,那么Python类将如何设置初始值