AttributeError:类型对象“ x”没有属性“ y”

时间:2019-10-29 15:11:55

标签: python

我知道这是一个反复出现的问题,但我真的不明白为什么会出现此错误。因此,我有一个类World,它具有一个类方法newDay(),该方法将_day递增1。但是这样做会导致此属性错误。我试图以不同的方式增加此值,但我一直遇到错误。这是一些代码:

class World:
    SIZE = Size_world
    ZONES = list()

    def __init__(self):
        self.bob = list()
        self.position = None
        self.available_energy = 0
        self._tick = 100
        self._day = 0
    @classmethod
    def newDay(cls):
        cls.destroyFood()
        cls.randomFood()
        cls._tick = D
        cls._day += 1
from World import *
def ui_simulation():

    Monde = World()
    Monde.initialize_world()

    while Monde._day < 50:

        bob_tab = Bob.BOBS[:]
        ZONES = World.ZONES[:]

        while Monde._tick > 0: # d est la variable qui décompte les ticks dans la journée. Elle va de 100 à 0
            separator = "."
            for i in range(Size_world):
                for j in range(Size_world-1):
                    if len(ZONES[i + j*Size_world].bob) > 0:
                        print("0", end=separator)
                    elif ZONES[i + j*Size_world].available_energy > 0:
                        print("X", end=separator)
                    else:
                        print(" ", end=separator)
                print(".")

            for bob in bob_tab:
                bob.eat()

            Monde._tick -= 1
            Monde.positionate_bob()
            sleep(0.04)
            clear_screen()
        Monde.newDay()

因此,一旦经过100个滴答声,就会调用newDay。我不明白的是,如果_day不是对象World的属性,为什么在进行测试Monde._day <50时为什么没有出现错误?

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

类方法中的cls参数是类,而不是该类的对象。我想您希望newDay成为常规成员函数:

def newDay(self):
    self.destroyFood()
    self.randomFood()
    self._tick = D
    self._day += 1

换句话说,_day不是类World的成员,而是每个World对象的成员。作为参考,在您的示例中,SIZEWorld的属性,因为您已经在类范围中声明了它。

编辑: 在python中,您可以通过对象访问类属性,反之则不能。类不知道其对象,因此通过类访问对象属性毫无意义。

通常,@classmethod装饰器用于类工厂方法(即创建和返回该类的对象)。要从该类的对象修改或检索数据,请使用常规方法。