考虑两个模块(在同一个文件夹中):
首先,person.py
from typing import List
from .pet import Pet
class Person:
def __init__(self, name: str):
self.name = name
self.pets: List[Pet] = []
def adopt_a_pet(self, pet_name: str):
self.pets.append(Pet(pet_name, self))
然后运行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, name: str, owner):
迄今为止我列出的所有选项都存在缺点。
还有其他方法吗? 一种允许我
- 将类拆分到不同的文件中
- 与指针一起使用类型注释,如所示
或者:是否有非常好的理由来代替我已经列出的解决方案之一?
AttributeError: module 'demo.person' has no attribute 'Person'
对我来说这很有道理,因为Pet类是在导入Person类的过程中被导入的,所以在导入Pet时,还没有导入Person类。 - levraininjaneerpython3 -m pkg.person
导入了模块。我已经根据我的第一条评论进行了更改。 - VPfB