如何使用 python 枚举解决这种循环依赖

How to resolve this circulary dependancy with python enums

所以我有 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 中,您不能引用 class 的字段,直到您声明 class。

所以,你需要在这样使用之前定义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]

您可以只在定义中保留 civilisation 属性并在 Civilisation class 也已定义后分配它,这样可以防止循环问题。我已经展示了一种可能的方法,但您可以只编写一个循环遍历 Universe class 的每个属性并分配 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]