打字:改变Python继承类中字段的类型

问题描述 投票:0回答:1

我们来看看:

class A:
    pass

class A2(A):
    @property
    def f(self):
        return None

class B:
    def __init__(el: A)
        self._a = el

class B2(B):
    def __init__(el: A2)
        super().__init__(el)

    def m():
        self._a.f()

现在,在调用

self._a.f()
时,我在最后一行出现输入错误,提示“无法访问类型 A 的成员 f”,即使它是在 B 中的 A2 处声明的,并且它具有该成员。 声明此代码片段以供键入工作的正确方法是什么?

python python-typing
1个回答
1
投票

A
没有成员
f
,因此尝试访问
_a.f
,其中
_a: A
正确地是一个错误。为了实现你想要的,你应该将
f
定义为
A
上未实现的函数,其子类应该实现:

class A:
    @property
    def f(self):
        raise NotImplementedError

或者使用抽象方法使其成为抽象基类

from abc import ABC, abstractmethod

class A(ABC):
    @property
    @abstractmethod
    def f(self): ...

这将通知类型检查器

A
及其所有子类都有一个成员
f
,并且您的代码应该正确进行类型检查。

如果您只想缩小

B2._a
的类型,这应该足够了:

class B2(B):
    _a: A2

    # rest of class definition
    ...
© www.soinside.com 2019 - 2024. All rights reserved.