假设我有这样的东西。
from typing import Mapping, Any
class Hidden:
def __init__(self, z: float, **kwargs: Any):
super().__init__(**kwargs)
self.z = z
class Base:
def __init__(self, x: int, **kwargs: Any):
super().__init__(**kwargs)
self.x = x
class Inherited(Base):
def __init__(self, y: int, **kwargs: Any):
super().__init__(**kwargs)
self.y = y
class Final(Inherited, Hidden):
pass
我应该如何注释它? 我试着用 Any
伴随着一些使用 TypedDict
但它只是想要值类型。 这是我能做的最好的事情吗?
更新自 Inherited
两者都需要 x
和 y
来初始化,它们应该被明确定义为参数。kwargs用于合作继承,允许一个类调用另一个类的init,而不需要显式地担心参数的类型(这里指的是 z:float
)是。因此 Any
在这种情况下确实是正确的注解。
同样,为了初始化 Final
我建议定义 __init__
和所有必要的参数,即, def __init__(self, x:int, y:int, z:float, **kwargs:Any)
同样的,Final也可以被其他类继承,并且它不关心派生类的参数,但保留了 **kwargs:Any
为了合作继承的兼容性
ps,不好意思,绕来绕去说的都是同一件事。
老答案 python中的kwargs是一个键值对的dict,这些键值对并不在方法的显式参数中。因此 **kwargs
会收集任何 foo=bar
争论,其中 foo
不在定义的参数中。的值 bar
可以是任何东西,这就是为什么 Any
因为 **
表示这些值将被自然地包裹在一个kwargs dict中。你可以对值的类型进行注释 bar
但在这里,你可以传递任何未声明的键值对。**kwargs:int
意味着你可以传递任何未声明的键值对,只要它是一个int。