为什么子类上的属性返回与超类上相同属性一致的类型是不允许的

问题描述 投票:0回答:1
class Foo:
    bar: str

class Bat(Foo):
    @property
    def bar(self) -> str:
        ...

鉴于上述代码,我的类型检查器(mypy)提出以下投诉:

error: Signature of "bar" incompatible with supertype "Foo"  [override]

这让我感到惊讶,因为从访问

Foo
属性/属性的调用者的角度来看,
Bat
bar
的实例的行为是相同的。类型检查器通过拒绝此代码来防止什么问题?

python inheritance mypy typing typechecking
1个回答
0
投票

扩展对OP的评论:

Mypy 的旧版本存在某种与此无关的问题/bug,这导致了项目 GitHub 上的一些讨论:Mypy 不允许使用属性覆盖属性,并且应该在 >=v0.990 的版本上修复该问题

还有一个讨论感觉更接近当前的OP阐述:使用属性覆盖变量:错误签名与超类型不兼容

在第二种情况下,发生的情况是......

class Foo:
    bar: str

...告诉 Mypy

.bar
将是一个可写属性,而只需在子类中声明
@property
Bat
...

class Bat(Foo):
    @property
    def bar(self) -> str:

...将使该属性变为只读。在这种情况下,最直接的修复可能是为

.bar
创建一个 setter。

以下代码:

class Foo:
    bar: str

class Bat(Foo):
    @property
    def bar(self) -> str:
        return "whatever"
    @bar.setter
    def bar(self):
        pass

产品:

Success: no issues found in 1 source file
© www.soinside.com 2019 - 2024. All rights reserved.