python - 两个 python 类如何声明相互引用和自身引用?
问题描述
这是一个非常基本的问题,实际上是两个问题合二为一。对于这两个问题,希望非常简单的答案暴露了我的 Python 的绿色可能是相同的。
下面的代码有两个问题:
- A 类
a:A=A()
创建 a 是NameError
因为 A 类在其声明完成之前不知道 A 类存在。 - A 类
b:B=B()
创建 a 是NameError
因为 A 类在声明 B 类之前不知道 B 类存在。
#! /usr/bin/python3.10
class A:
a:A=A()
b:B=B()
class B:
a:A=A()
b:B=B()
我遇到类型错误并想使用 mypy. 如果我在类声明之外创建变量作为属性或以其他方式隐藏所需的类型,那么 mypy 将看不到类型声明并且无法解析我的程序以查找类型错误。
你可能会问,我为什么要这个?递归数据结构具有不定式应用,但是...
- 类 A 引用自身的情况是一个简单的链接列表。链接列表消除了跟踪索引的需要,同时允许简单的插入、删除和下一次迭代,代价是应用程序可能不需要的慢速索引。
- A 类引用 B 类而 B 类引用 A 类的情况是一个简单的容器,其中 B 类(容器)包含 A 类(项目)的一组实例,这些实例知道它们所在的容器。
Python 能否以 mypy 对类型声明感到满意的方式完成这些非常基本的事情?
我开始认为“python 方式”是让每个函数对每个参数进行类型检查。我考虑得越多,解释型语言提出这样的要求就越合乎逻辑,但我仍然希望让我的代码尽可能有条理和声明性。
解决方案
我认为您的部分问题没有解决方案。您的声明:
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"]
推荐阅读
- r - 用多列输出改变 rnorm
- python - 封装我的后端应用程序的动态更改和添加的部分
- docker - 配置 prometheus 以从 dockerized nodejs pod 收集自定义指标
- excel - 嵌套的 For 循环锁定 Excel
- java - 如何使用 ActiveMQ 5.x 检索创建的会话主题(和队列)
- azure-ad-b2c - 在 Azure Identity Experience Framework 中记录声明
- angular - 错误:npm install -g angular-cli npm ERR
- mongodb - Socket.io,Mongodb 将未定义返回到前端
- fortran - 带 BLAS 功能的打包存储
- python - 为什么我在 python3 中的这段代码会出现这个错误?