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

时间:2017-04-23 11:49:38

标签: python python-3.x oop

我的情况是我有两个班级(帝国和城市)。帝国由许多城市组成,因此帝国的实例有一个城市列表作为属性。城市本身具有所有者的属性,可以链接回帝国。目前我的代码看起来像这样:

Empire.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() 

City.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_city()方法或每次创建一个城市时手动设置城市的所有者。如果我没有,那么我将拥有None作为所有者,而do_some_other_stuff_that_requires_owner将会崩溃。我希望通过像

之类的东西来防止这种可能的错误来源

City.py

import Empire

class City:

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

    ....

这让我更舒服一切都是正确的类型(即使它不那么pythonic)。这个问题是循环导入。虽然它确实有效,但循环进口让我感到紧张,我的印象是应该避免它们。

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

[PS:我知道吸气剂和孵化器不是非常pythonic,但我做这个项目的部分原因是为了更好地了解OOP并养成一些好习惯]

编辑:已经提出了一个可能的答案,即循环进口的各种方式。从偶然的讨论中,我听说循环导入是代码结构错误并应该重构的标志。这更可取吗?如果是这样,应该怎么做呢?

0 个答案:

没有答案