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类将如何设置初始值