如何避免python中类型提示指针属性引起的循环依赖

如何避免python中类型提示指针属性引起的循环依赖,第1张

概述考虑两个模块(在同一个文件夹中): 首先,person.py from typing import Listfrom .pet import Petclass Person: def __init__(self, name: str): self.name = name self.pets = [] # type: List[Pet] de 考虑两个模块(在同一个文件夹中):

首先,person.py

from tyPing import Listfrom .pet import Petclass Person:    def __init__(self,name: str):        self.name = name        self.pets = [] # type: List[Pet]    def adopt_a_pet(self,pet_name: str):        self.pets.append(Pet(pet_name))

然后pet.py

from .person import Personclass Pet:    def __init__(self,name: str,owner: Person):        self.name = name        self.owner = owner

由于循环依赖,上面的代码不起作用.你会收到一个错误:

importError: cannot import name 'Person'

一些使它工作的方法:

>将Person和Pet类的定义保存在同一个文件中.
>取消pet.owner属性(这是一个方便的指针)
>不要使用类型提示/注释,它会导致循环引用:

例如只有:

class Pet:    def __init__(self,owner):

我看到到目前为止我列出的所有选项都有一些缺点.

还有另外一种方法吗?
一个允许我

>将类拆分为不同的文件
>使用类型注释与指示符结合使用

或者:是否有充分的理由来遵循我已经列出的解决方案之一?

解决方法 经过一番学习,我意识到有一种正确的方法可以做到这一点:继承:

首先我定义Person,没有[pets]或OP中的方法.
然后我定义了Pets,拥有Person类的所有者.
然后我定义

from tyPing import Listfrom .person import Personfrom .pet import Petclass Petowner(Person):    def __init__(self,name: str):        super().__init__(name)        self.pets = []  # type: List[Pet]    def adopt_a_pet(self,pet_name: str):        self.pets.append(Pet(pet_name))

现在,Pet中需要引用Pet的所有方法都应该在Petowner中定义,而Pet中使用的Person的所有方法/属性都需要在Person中定义.如果需要在Pet中使用仅存在于Petowner中的方法/属性,则新的子类Pet,例如应该定义OwnedPet.

当然,如果命名困扰我,我可以从Person和Petowner分别改为BasePerson和Person或类似的东西.

总结

以上是内存溢出为你收集整理的如何避免python中类型提示指针属性引起的循环依赖全部内容,希望文章能够帮你解决如何避免python中类型提示指针属性引起的循环依赖所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1196376.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存