[英]Using python generics and inheritance
我需要实现一堆类,它们都需要对父类进行相同的修改。 作为一个熟练的 C++ 程序员,我会寻找一个模板类。 但这需要在 Python 中实现。 在这里,我是一个菜鸟。 我找到了“通用”并构建了这个例子来展示我的问题的核心。 实际程序稍微复杂一些(使用 ReportLab 生成 PDF 文档)。 我需要子类化以从类框架中受益,这导致我尝试使用继承来实现泛型。
问题是我无法理解如何将参数传递给“超级”类,在这里我尝试制作一个 Generic。
第一次尝试:
super().__init__(*argv, **kwargs)
第二次尝试:
super(G, self).__init__(*argv, **kwargs)
第三次尝试:
T.__init__(*argv, **kwargs)
这是完整的示例:
from typing import Generic, TypeVar
class A():
def __init__(self, i : int):
self.i = i
def draw():
print(self.i)
class C():
def __init__(self, s : str):
self.s = s
def draw():
print(self.s)
T = TypeVar('T')
class G(Generic[T]):
def __init__(self, *argv, **kwargs):
super().__init__(*argv, **kwargs)
def draw():
# Here is some special going to happen
super().draw()
gA = G[A](5)
gB = G[B]('Hello')
gA.draw()
gB.draw()
我得到的输出:
Traceback (most recent call last):
File "<string>", line 34, in <module>
File "/usr/lib/python3.8/typing.py", line 729, in __call__
result = self.__origin__(*args, **kwargs)
File "<string>", line 28, in __init__
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
您对 Python 泛型的理解是错误的。 Generic,比如Generic[T]
,使TypeVar
T
充当您为实例提供的任何东西。
我发现这个页面对学习泛型非常有用。
typing.Generic
专门用于类型注释; Python 没有提供与以下任何一种等效的运行时概念:
后者对functools.singledispatch
的支持极其有限,但它只处理一个参数的类型,并且运行时类型检查相当慢。
也就是说,这里不需要基于模板的类或多态继承层次结构; Python 非常乐意在任何提供该实际名称的方法上调用draw
。 您在此处编写的代码可以执行以下操作:
a = A(5)
b = B('Hello')
a.draw()
b.draw()
无需使用G
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.