繁体   English   中英

使用python泛型和继承

[英]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 没有提供与以下任何一种等效的运行时概念:

  1. 模板类,或
  2. 按参数计数/类型的函数重载

后者对functools.singledispatch的支持极其有限,但它只处理一个参数的类型,并且运行时类型检查相当慢。

也就是说,这里不需要基于模板的类或多态继承层次结构; Python 非常乐意在任何提供该实际名称的方法上调用draw 您在此处编写的代码可以执行以下操作:

a = A(5)
b = B('Hello')

a.draw()
b.draw()

无需使用G

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM