python - 相互引用类的类型检查

标签 python

很抱歉,如果这是一个菜鸟问题,但我尝试了谷歌,但没有帮助。假设我有两个类,A 和 B。我希望 A 将 B 的实例作为参数。同样,我希望 B 获取 A 的实例。如果我在不同的模块中定义我的类并希望对我的类进行类型检查,我必须将 B 导入到包含 A 的模块,反之亦然,这将使我到圆形导入。我该怎么办?有没有办法在实际定义这些类之前声明它们的存在,这样我就可以在 init 函数中引用它们?

我尝试在同一个模块中定义所有类,这可行,但这违背了项目组织的目的。

最佳答案

如果可能,最好完全避免循环性质。实现此目的的一种方法是使用抽象基类来实现重要功能,或者您也可以使用协议(protocol)来实现此目的。

假设我们有这两个类:

class A:
    def __init__(self) -> None:
        self.a_property = "a"

    def action(self, b: B) -> None:
        print(b.b_property)


class B:
    def __init__(self) -> None:
        self.b_property = "b"

    def action(self, a: A) -> None:
        print(a.a_property)

这有一个明显的循环。如果我们将重要组件抽象为协议(protocol),那么我们就可以避免这个循环:

from typing import Protocol


class AProtocol(Protocol):
    a_property: str


class BProtocol(Protocol):
    b_property: str


class A:
    def __init__(self) -> None:
        self.a_property = "a"

    def action(self, b: BProtocol) -> None:
        print(b.b_property)


class B:
    def __init__(self) -> None:
        self.b_property = "b"

    def action(self, a: AProtocol) -> None:
        print(a.a_property)

关于python - 相互引用类的类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75633665/

相关文章:

python - 调用StartInstances操作时发生客户端错误(UnauthorizedOperation)

python - 如何在 Linux/Python/Tweepy 环境中使用 LZO 压缩 Twitter 流?

python - pandas 添加更高级别的列多重索引

python - CPython 和 IronPython cPickle 之间的兼容性

python - 如何在Python中使用pyodbc进行参数化查询?

python - GridSearchCV 是否存储所有参数组合的所有分数?

python - Pyramid "model"也是 Pyramid "resource"吗?

python - Pygame:矩形对象在 For 循环中无法正确渲染

python - Python程序错误

python - 如何启用 NewRelic Python 代理?