检查类型时如何避免循环引用

2024-05-29 11:52:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个阶级(帝国和城市)的情况。一个帝国由许多城市组成,因此帝国的实例有一个城市列表作为属性。这座城市本身就有一个与帝国有关的所有者属性。目前,我的代码如下所示:

你知道吗帝国.py你知道吗

import City

class Empire:
    def get_city_list(self):
        return self.city_list

    def add_city(self, city):
        assert(isinstance(city, City.City)), "Invalid city added to empire"
        self.city_list.append(city)
        city.owner = self

    def do_all_cities(self):
        for city in self.get_city_list():
            city.do_some_stuff() 

你知道吗城市.py你知道吗

class City:

    def __init__(self):
        self.owner = None

    def get_owner(self):
        return self.owner

    def do_some_stuff(self):
         pass

    def do_some_other_stuff_that_requires_owner(self):
         pass

如果每次创建一个城市时都使用add\u city()方法或手动设置城市的所有者,所有这些都可以正常工作。如果我不这样做,我就没有主人了,我会做一些其他需要的事情,主人会崩溃的。我想通过以下方法来防止这种可能的错误源

你知道吗城市.py你知道吗

import Empire

class City:

    def __init__(self, owner):
        assert(isinstance(owner, Empire.Empire)), "Invalid empire as owner"
        self.owner = owner

    ....

这让我觉得每件事都是正确的类型(即使它不太像Python)。问题是循环导入。虽然它确实有效,循环进口让我紧张,我的印象是,他们应该避免。你知道吗

解决这个问题的正确方法是什么?我有两个独立的模块,每个模块都需要检查一个对象是否是属于另一个模块的类的实例。你知道吗

[注:我知道getter和setter不是很pythonic,但我做这个项目的部分原因是为了更好地了解OOP并养成一些好习惯]

编辑:有人提出了一个可能的答案,那就是循环导入的各种方式。从偶然的讨论中,我听说循环导入是代码结构不良的标志,应该进行重构。这样更好吗?如果是的话,这里应该怎么做?你知道吗


Tags: 方法pyselfcitygetdefsomedo

热门问题