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
的实例的行为是相同的。类型检查器通过拒绝此代码来防止什么问题?
扩展对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