Class 中的 NameError 在其他 Class 中

NameError in a Class Within a Other Class

在这个程序中,我试图创建一个名为 Human 的 class,其中有 classes 代表人类的不同属性:

class Human:       
        class Health:
            def __init__(self):
                self.thirst = 24
                self.hunger = 36
                self.howSleepy = 48
        class Ginetics:
            def __init__(self, spawnCoordinates, parentM, parentF, isMale):
                self.spawnCoordinates = coordinates
                self.parentM = parentM 
                self.parentF = parentF 
                self.isMale = isMale
                self.kids = [[]]
        class General:
            def __init__(self, birthday):    
                self.birthday = birthday

        def __init__(self, spawnCoordinates, parentM, parentF, isMale, birthday):
            self.Health = Health()
            self.Genetics = Genetics(spawnCoordinates, parentM, parentF, isMale)
            self.General = General(birthday)

但是当我运行这个...

hum1 = Human((500,500), "Dan", "Lisa", True, 120)

它给我这个错误:

NameError: name 'Health' is not defined

Health 等人。不是全局变量;它们是 class 属性。你必须写 self.Health = Human.Health().

但是,嵌套的 classes 通常不用于 Python。 意图 可能仅将 HealthHuman 的实例一起使用,但其定义与 Human 没有任何内在联系。只需全局声明即可:

class Health:
    def __init__(self):
        self.thirst = 24
        self.hunger = 36
        self.howSleepy = 48


...


class Human:
    def __init__(self, ...):
        self.health = Health()
        ...    

将您的 类 分开而不是嵌套它们,这样做没有任何好处,而且会降低您的代码的可读性。

class Human:
    def __init__(self, spawnCoordinates, parentM, parentF, isMale, birthday):
        self.Health = Health()
        self.Genetics = Genetics(spawnCoordinates, parentM, parentF, isMale)
        self.General = General(birthday)

class Health:
    def __init__(self):
        self.thirst = 24
        self.hunger = 36
        self.howSleepy = 48

class Genetics:
    def __init__(self, spawnCoordinates, parentM, parentF, isMale):
        self.spawnCoordinates = spawnCoordinates
        self.parentM = parentM 
        self.parentF = parentF 
        self.isMale = isMale
        self.kids = [[]]

class General:
    def __init__(self, birthday):
        self.birthday = birthday


hum = Human((500, 500), "Dan", "Lisa", True, 120)
print(hum.General.birthday)

输出:

120