加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:20:05 所属栏目:Python 来源:网络整理
导读:考虑两个模块(在同一个文件夹中): 首先,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(
考虑两个模块(在同一个文件夹中):

首先,person.py

from typing import List
from .pet import Pet


class 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 Person


class 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 List
from .person import Person
from .pet import Pet


class 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或类似的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读