Special methods are looked up on the class, and not on the instance - unlike regular methods that are looked up on the instance first. See Special method lookup in the Python data model docs.
Thinking about Class
as an instance of type
, this means when you do
Class.getitem(test)
It looks first for exactly what you tell it: a method in Class
's own attributes called getitem
. But, when you use
Class[test]
it skips this, and goes straight to type
(being the class of Class
, or its metaclass), and so calls type.__getitem__(Class, test)
. So, what's happening isn't that __getitem__
gets type
as its first argument (it would still get Class
, as it does if you explicitly Class.__getitem__(test)
), its that the __getitem__
that Python looks for in this case doesn't exist. To make it exist, you need to define your own metaclass for Class
that defines it as an instance method, rather than defining it on Class
as a classmethod.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…