如何避免python中类型提示指针属性引起的循环依赖
考虑两个模块(在同一个文件夹中):
首先,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类的定义保存在同一个文件中. 例如只有: class Pet: def __init__(self,owner): 我看到到目前为止我列出的所有选项都有一些缺点. 还有另外一种方法吗? >将类拆分为不同的文件 或者:是否有充分的理由来遵循我已经列出的解决方案之一? 解决方法
经过一番学习,我意识到有一种正确的方法可以做到这一点:继承:
首先我定义Person,没有[pets]或OP中的方法. 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或类似的东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |