为什么我们必须使用__getitem__
而不是通常的操作员访问权限?
class MyDict(dict):
def __getitem__(self, key):
return super()[key]
我们得到TypeError: 'super' object is not subscriptable
。
取而代之的是,我们必须使用super().__getitem__(key)
,但是我从来没有完全理解为什么-是什么阻止了以允许操作员访问的方式实现super?
标化只是一个例子,我也有同样的问题__getattr__
,__init__
等等。
该文档试图解释原因,但我不理解。
CPython的bug跟踪程序的问题805304,“超级实例不支持项目分配”,让Raymond Hettinger给出了关于所遇到的困难的详细解释。
这种方法无法自动运行的原因是,由于Python的方法缓存,此类方法必须在类上定义,而代理的方法则在运行时找到。
他提供了一个补丁,可以提供此功能的子集:
+ if (o->ob_type == &PySuper_Type) {
+ PyObject *result;
+ result = PyObject_CallMethod(o, "__setitem__", "(OO)", key, value);
+ if (result == NULL)
+ return -1;
+ Py_DECREF(result);
+ return 0;
+ }
+
因此这显然是可能的。
但是,他得出结论
我一直在想,可以不考虑这一点,而只是证明超级对象仅在显式属性查找时才能发挥作用。
否则,要完全修复它,需要在每个直接从插槽表调用函数的位置组合Python,然后在插槽为空的情况下使用属性查找添加后续调用。
当涉及到诸如repr(obj)之类的功能时,我认为我们希望超级对象能够标识自己,而不是将调用转发给目标对象的__repr __()方法。
争论似乎是,如果__dunder__
方法被代理,那么要么被代理,要么__repr__
它们之间存在不一致。super()
,因此,可能不希望代理此类方法,以免它过于接近程序员的恐怖谷。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句