考虑下面的代码。我正在尝试对内置 enumerate
进行子类化,以便它为 for 循环的每一轮打印一行。代码似乎可以正常工作,这令人惊讶,因为我从未调用过 super().__init__(x)
。那么,这里发生了什么?谁以正确的方式初始化基类 enumerate
?这里发生的 __new__
方法有什么魔力吗?
class myenum(enumerate):
def __init__(self,x):
self.x_ = x
self.len_ = len(x)
def __next__(self):
out = super().__next__()
print(f'Doing {out[0]} of {self.len_}')
return out
for ictr, key in myenum(['a','b','c','d','e']):
print('Working...')
最佳答案
__init__
方法总是可选的。实例的所有初始化始终可以完全在 __new__
中完成方法,enumerate
就是这种情况类,其__new__
方法定义here在enum_new_impl
函数,您可以在其中看到 iterable
参数存储为属性 en_sit
返回对象的 en
, 结构类型 enumobject
:
static PyObject *
enum_new_impl(PyTypeObject *type, PyObject *iterable, PyObject *start)
{
enumobject *en;
...
en->en_sit = PyObject_GetIter(iterable);
...
return (PyObject *)en;
}
关于python - 在 python 中子类化内置枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74806815/