Python 如何在“typing”模块类中实现“[]”?

Python 如何在“typing”模块类中实现“[]”?,python,Python,使用键入模块,您可以编写 from typing import Dict my_type: Dict[str, int] 其中,Dict是一个类。我的问题是:类名后面的括号是什么。python的哪个语法方面允许这种语法?我怎么能在自己的课堂上做类似的事情呢?感谢@timgeb为我指明了正确的方向。事实证明,它确实使用了\uuu getitem\uuu。但是,由于\uuuu getitem\uuuu引用了一个实例,因此必须在当前类是其实例的内容中定义它。因此,您必须使用元类。乙二醇 class

使用
键入
模块,您可以编写

from typing import Dict
my_type: Dict[str, int]

其中,
Dict
是一个类。我的问题是:类名后面的括号是什么。python的哪个语法方面允许这种语法?我怎么能在自己的课堂上做类似的事情呢?

感谢
@timgeb
为我指明了正确的方向。事实证明,它确实使用了
\uuu getitem\uuu
。但是,由于
\uuuu getitem\uuuu
引用了一个实例,因此必须在当前类是其实例的内容中定义它。因此,您必须使用元类。乙二醇

class Root(type):
    def __getitem__(self, i):
        print(f'arguments: {i}')


class MyDict(metaclass=Root):
    pass
现在

MyDict[list, str]
你得到

arguments: (<class 'list'>, <class 'str'>)
参数:(,)

通过巧妙地实现
\uuu getitem\uuu
:)请每个问题问一个问题。@Aran Fey:事实上,它们可以被视为同一问题的两个方面。如果(1)得到了回答,(2)可能会出现。@timgeb:谢谢。我怀疑是这样,但没有看到
\uu getitem\uuu
@classmethod
不,它们是两个独立的问题。问题#2得到了回答。回答得好,你在我(现已删除)的其他评论中用大量的手工说明了我所描述的内容。“因为
\uuuu getitem\uuuuuu
引用实例”可以更准确地表述为“在对象类型上查找特殊方法”(类也是对象,默认情况下具有类型
类型
)——更准确地说,可以引用对象的相关部分。使用
[]
是对
\uuuu getitem\uuuuuu
的一种隐含用法。稍微吹毛求疵:
参数
是误导性的。
\uu getitem\uuu
只有一个参数(除self外),在本例中,您正好传递了一个元组。这很重要,因为
MyDict[int]
不会得到元组,
MyDict[int,str]
会得到一个元组。