【问题标题】:Override type-hint of a parameter in __init__覆盖 __init__ 中参数的类型提示
【发布时间】:2022-01-24 12:54:09
【问题描述】:

关于此代码:

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 警告我最后一行:

类“Obj”的未解析属性引用“b”

但我将__init__ 中传递的obj 键入提示为ObjChild,因此它应该静态知道self.obj 是ObjChild 实例,并且将具有b方法。

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

【问题讨论】:

  • 在类级别添加obj: ObjChild 类型提示可能会修复它。
  • 问题可能是 Pycharm 没有断定super().__init__(obj) 将self.obj 设置为obj。一种解决方案可能是将self.obj.b() 替换为obj.b()。
  • 对我来说,你正在用一个你告诉它的类型为 obj 的类来初始化 A。那么你为什么期望 obj 类知道b,因为它不是 obj 类的一部分,它只存在于 objChild 类中。继承起作用,objChild 将知道 obj 中的属性,但反之则不然
  • @md2perpe。这显然不是解决方案
  • @MadPhysicist。当我写下我的答案并且代码看起来不同时,这是一个解决方案。

标签: python pycharm overriding


【解决方案1】:

将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 之间没有任何联系。

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2018-12-05
    • 2012-05-20
    • 2019-08-17
    • 1970-01-01
    • 2019-08-30
    • 2014-04-18
    • 2021-11-22
    • 2021-01-17
    相关资源
    最近更新 更多