假设我有一个基本的类继承:
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 能够提供有意义的完成或检查?
是的,这是可能的,但我个人不会推荐它 - 见下文:
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
这似乎是一个坏主意:不清楚为什么你想要两个具有几乎相似字段和相似方法的类。您可能只需拥有
class B
并将 portnumber
设置为 None
并在方法中检查它。
通常,使用继承是一个坏主意,除非您被框架或主管强制,特别是如果您的类像示例中一样简单。