【问题标题】:How to resolve this circulary dependancy with python enums如何使用 python 枚举解决这种循环依赖
【发布时间】:2021-12-26 17:49:01
【问题描述】:

所以我有 2 个枚举,问题是第一个枚举引用了第二个枚举,而第二个枚举也引用了它。

    from enum import Enum
    
    class UniverseData:
        def __init__(self, name, coordinate, civilisations)
            self.civilisation_name = name
            self.coordinate = coordinate
            self.civilisation = civilisations
    
    class CivilisationData:
        def __init__(self, name, population_cap, universe)
            self.name = name
            self.population_cap = population_cap
            self.universe = universe
    
    class Universe(Enum):
        Yievdal = UniverseData('Yievdal', 'X258RC', [Civilisation.HUMANITY, Civilisation.ERG, Civilisation.ELF])
        Krastam = UniverseData('Krastam', 'X258BC', [Civilisation.MOJNA, Civilisation.CELES])
    
    class Civilisation(Enum):
        HUMANITY = CivilisationData('humanity', '11B', Universe.Yievdal)
        ERG = CivilisationData('erg', '2B', Universe.Yievdal)
        ELF = CivilisationData('elf', '2B', Universe.Yievdal)
        MOJNA = CivilisationData('mojna', '50B', Universe.Krastam)
        CELES = CivilisationData('celes', '110B', Universe.Krastam)

这里的问题是Universe枚举不能使用Civilization枚举,因为它是在下面声明的。

有没有办法解决这个问题?我希望能够在全宇宙枚举中拥有全宇宙文明。

谢谢。

【问题讨论】:

    标签: python python-3.x oop enums


    【解决方案1】:

    您可以将civilisation 属性保留在定义中并在Civilisation 类也已定义后分配它,这样可以防止循环问题。我已经展示了一种可能的方法,但是您可以编写一个函数,循环遍历 Universe 类的每个属性并分配一个 civilisation

    from enum import Enum
    
    class UniverseData:
        def __init__(self, name, coordinate, civilisations=None)
            self.civilisation_name = name
            self.coordinate = coordinate
            self.civilisation = civilisations
    
    class CivilisationData:
        def __init__(self, name, population_cap, universe)
            self.name = name
            self.population_cap = population_cap
            self.universe = universe
    
    class Universe(Enum):
        Yievdal = UniverseData('Yievdal', 'X258RC')
        Krastam = UniverseData('Krastam', 'X258BC')
    
    class Civilisation(Enum):
        HUMANITY = CivilisationData('humanity', '11B', Universe.Yievdal)
        ERG = CivilisationData('erg', '2B', Universe.Yievdal)
        ELF = CivilisationData('elf', '2B', Universe.Yievdal)
        MOJNA = CivilisationData('mojna', '50B', Universe.Krastam)
        CELES = CivilisationData('celes', '110B', Universe.Krastam)
    
    
    Universe.Yievdal.civilisation = [Civilisation.HUMANITY, Civilisation.ERG, Civilisation.ELF]
    Universe.Krastam.civilisation = [Civilisation.MOJNA, Civilisation.CELES]
    

    【讨论】:

    • 它可以工作,但我不明白为什么,这段代码在src.common。在另一个脚本中我做from src.common import Universe, Civilisation。但由于我只是导入UniverseCivilisation,执行将文明添加到Univese 枚举中的代码是什么?
    • @sliders_alpha: 导入模块时,执行顶层代码;这意味着定义了顶级函数,运行了顶级类主体,并创建了枚举。这就是为什么将昂贵的操作放在顶层是一个坏主意的原因。而是将它们放在可以在适当时间调用的函数中。
    • 这有一个缺点,之后无法进行比较。我必须使用 Universe_variable.name == Universe.Yievdal.name,但在没有名字之前我可以做到
    【解决方案2】:

    在 python 中,你不能在声明类之前引用类的字段。

    所以,你需要在这样使用之前定义class Civilisation

    from enum import Enum
    
    
    class UniverseData:
        def __init__(self, name, coordinate, civilisations):
            self.civilisation_name = name
            self.coordinate = coordinate
            self.civilisation = civilisations
    
    
    class CivilisationData:
        def __init__(self, name, population_cap, universe):
            self.name = name
            self.population_cap = population_cap
            self.universe = universe
    
    
    class Universe(Enum):
        Yievdal = UniverseData('Yievdal', 'X258RC', [])
        Krastam = UniverseData('Krastam', 'X258BC', [])
    
    
    class Civilisation(Enum):
        HUMANITY = CivilisationData('humanity', '11B', Universe.Yievdal)
        ERG = CivilisationData('erg', '2B', Universe.Yievdal)
        ELF = CivilisationData('elf', '2B', Universe.Yievdal)
        MOJNA = CivilisationData('mojna', '50B', Universe.Krastam)
        CELES = CivilisationData('celes', '110B', Universe.Krastam)
    
    
    Universe.Yievdal.civilisations = [Civilisation.HUMANITY, Civilisation.ERG, Civilisation.ELF]
    Universe.Krastam.civilisations = [Civilisation.MOJNA, Civilisation.CELES]
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2012-03-15
      • 2016-09-21
      相关资源
      最近更新 更多