覆盖 __init__ 中参数的类型提示

Override type-hint of a parameter in __init__

在此代码上:

class Obj():
    def a(self):
        pass


class ObjChild(Obj):
    def b(self):
        pass


class A:
    def __init__(self, obj: Obj):
        self.obj = obj


class B(A):
    def __init__(self, obj: ObjChild):
        super().__init__(obj)
        
    def kuku(self):
        self.obj.b()

Pycharm 警告我最后一行:

Unresolved attribute reference 'b' for class 'Obj'

但是我将 __init__ 中传递的 obj 类型提示为 ObjChild,因此它应该静态地知道 self.obj 是一个 ObjChild 实例,并且会有 b 方法。

我怎样才能让 Pycharm 意识到这一点?它弄乱了我在项目中的自动完成。

使A成为Generic:

from typing import Generic, TypeVar


class Obj:
    def a(self):
        pass


_Obj = TypeVar('_Obj', bound=Obj)


class ObjChild(Obj):
    def b(self):
        pass


class A(Generic[_Obj]):
    def __init__(self, obj: _Obj):
        self.obj = obj


class B(A[ObjChild]):
    def __init__(self, obj: ObjChild):
        super().__init__(obj)
        self.obj.b()

除非您将 A 设为泛型,否则将 ObjChild 传递给 A.__init__A.obj 成为 ObjChild.[=18 之间没有任何联系=]