如何使用 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]
所以我有 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]