所以我正在尝试为我正在为角色扮演游戏编写的自动生成器设置我的数据结构,并且我遇到了一些特定的继承怪癖。以下是数据结构的摘录。
class data():
def __init__(self):
self.races = Races()
class Races(data):
def __init__(self):
self.humans = Humans()
class Humans(Races):
def __init__(self):
self.Characteristics = {
'Brawn':2,
'Agility':2,
'Intellect':2,
'Cunning':2,
'Willpower':2,
'Presence':2
}
结构中还有很多,但这只是一个自下而上的概述。我也知道它是奇怪的缩进但是严格的堆栈溢出。
现在我希望这个对象有两个行为。
能够调用任何特征
data.races.humans.Characteristic['brawn']
作为呼叫格式。
也可以使用生成器迭代子类:
(subclass for subclass in data.races.__subclasses__())
显然在我实例化了对象之后。
现在我已尝试多次更改结构,我可以得到它,所以我可以用点表示法调用它,但它返回AttributeError: 'Races' object has no attribute '__subclasses__'
反之亦然,将它完全分成更传统的结构,但我不能用点符号调用,这使得很难保持一切有组织和可读。
任何人都可以建议我做错了什么或更多Pythonic方法来解决问题吗?
答案 0 :(得分:0)
让我们从中间开始吧。据推测,任何种族的角色都具有相同的属性,只是这些属性的值不同。
class Race:
def __init__(self):
self.life = 100 # 100% healthy
class Humanoid(Race):
def __init__(self):
super().__init__()
self.legs = 2
class Insectoid(Race):
def __init__(self):
super().__init__()
self.legs = 8
class Human(Humanoid):
def __init__(self):
super().__init__()
self.brawn = 2
self.agility = 2
self.intellect = 2
self.cunning = 2,
self.willpower = 2
self.presence = 2
class Elf(Humanoid):
def __init__(self):
super.__init__()
self.brawn = 1
self.agility = 3
self.intellect = 3
self.cunning = 2
self.willpower = 3
self.presence = 1
现在,任何特定字符都将被实例化为正确的类:
some_elf_1 = Elf()
some_human_1 = Human()
some_human_2 = Human()
for character in [some_elf_1, some_human_1, some_human_2]:
print("Brawn: ", character.brawn)
在前面的内容中,每个角色的实际类型无关紧要;只要您知道它是Race
的某个子类(或Race
本身的实例),它就会有一个brawn
属性,您可以访问它。
如果没有更多详细信息,您data
课程似乎没有必要。
答案 1 :(得分:0)
所以,虽然给出的答案让我走上了正确的轨道,但我意识到我需要什么,而且只是为了任何可怜的灵魂投入我的命运。
首先 - 我意识到我的生成器出了什么问题,我正在调用初始化对象而不是类对象。对象没有子类 attrib,我读到的大多数指南都误解了我的信息!
其次,我考虑使用元类来从我的对象中获取我想要的迭代行为,只需使用注册表属性来实现,该属性是所有已初始化的子类的字典。
lass Races(data):
def __init__(self):
self.humans = Humans()
self.droids = Droids()
self.twileks = Twileks()
self.registry = {
'humans':self.humans,
'droids':self.droids,
'twileks':self.twileks
}
这允许我在初始化之后迭代不同种族的某些值。
感谢所有出色的答案!