首页 > 解决方案 > 两个 python 类如何声明相互引用和自身引用?

问题描述

这是一个非常基本的问题,实际上是两个问题合二为一。对于这两个问题,希望非常简单的答案暴露了我的 Python 的绿色可能是相同的。

下面的代码有两个问题:

    #! /usr/bin/python3.10
    
    class A:
       a:A=A()
       b:B=B()
    
    class B:
       a:A=A()
       b:B=B()

我遇到类型错误并想使用 mypy. 如果我在类声明之外创建变量作为属性或以其他方式隐藏所需的类型,那么 mypy 将看不到类型声明并且无法解析我的程序以查找类型错误。

你可能会问,我为什么要这个?递归数据结构具有不定式应用,但是...

Python 能否以 mypy 对类型声明感到满意的方式完成这些非常基本的事情?

我开始认为“python 方式”是让每个函数对每个参数进行类型检查。我考虑得越多,解释型语言提出这样的要求就越合乎逻辑,但我仍然希望让我的代码尽可能有条理和声明性。

标签: pythonmypyrecursive-datastructures

解决方案


我认为您的部分问题没有解决方案。您的声明:

class A:
   a:A=A()
   b:B=B()

意味着 A().a 是 A 的另一个实例,它又引用另一个 A,依此类推。这不一定是个问题,但让它成为对象创建或实例化的一部分将自动需要无限数量的对象!也许您可以执行以下操作:

from typing import Optional


class A:
    a: Optional["A"]
    def __init__(self, other: Optional["A"] = None):
        self.a = other

这将允许您有一个基本情况(self.a 是 None)和 self.a 是 A 的另一个实例的其他情况。

注意上面也使用“A”来定义类型。这可以让您解决类型提示问题,尽管我不知道它是如何与 mypy 一起玩的!您可以应用它,以便您的解决方案如下所示:

from typing import Optional


class A:
    a: Optional["A"]
    b: Optional["B"]

class B:
    a: Optional["A"]
    b: Optional["B"]

推荐阅读