有没有办法继承父级 __init__ 参数?

问题描述 投票:0回答:2

假设我有一个基本的类继承:

class A:
    def __init__(self, filepath: str, debug=False):
        self.filepath = filepath
        self.debug = debug

class B(A):
    def __init__(self, portnumber: int, **kwargs):
        super(B, self).__init__(**kwargs)
        self.portnumber = portnumber

为了打字和完成目的,我想以某种方式将参数列表从

A.__init__()
“转发”到
B.__init__()

有办法做到这一点吗?让类型检查器正确推断

B.__init__(...)
的签名并让 IDE 能够提供有意义的完成或检查?

python inheritance python-typing
2个回答
1
投票

是的,这是可能的,但我个人不会推荐它 - 见下文:


from typing import TypedDict, Unpack

class AInterface(TypedDict):
    filepath: str
    debug: bool

class A:
    def __init__(self, **kwargs: Unpack[AInterface]):
        self.filepath = kwargs["filepath"]
        self.debug = kwargs["debug"]

class B(A):
    def __init__(self, portnumber: int, **kwargs: Unpack[AInterface]):
        super().__init__(**kwargs)
        self.portnumber = portnumber

通过使用

TypedDict
我们可以构造 kwargs 参数,给它一个类型,并允许我们传递它。如果您有多重继承,您甚至可以将接口组合在一起以生成当前的 kwargs 类型。当您对 A 和 B 使用
__init__
时,如果您错过了
TypedDict
的部分内容,您仍然会收到警告。

我会手动将参数传递到下一层:

class A:
    def __init__(self, filepath: str, debug: bool =False):
        self.filepath = filepath
        self.debug = debug

class B(A):
    def __init__(self, portnumber: int, filepath: str, debug: bool =False):
        super().__init__(filepath=filepath, debug = debug)
        self.portnumber = portnumber

0
投票

这似乎是一个坏主意:不清楚为什么你想要两个具有几乎相似字段和相似方法的类。您可能只需拥有

class B
并将
portnumber
设置为
None
并在方法中检查它。

通常,使用继承是一个坏主意,除非您被框架或主管强制,特别是如果您的类像示例中一样简单。

© www.soinside.com 2019 - 2024. All rights reserved.