
首先,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中类型提示指针属性引起的循环依赖所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)