我知道这是一个反复出现的问题,但我真的不明白为什么会出现此错误。因此,我有一个类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时为什么没有出现错误?
谢谢您的时间。
答案 0 :(得分:0)
类方法中的cls
参数是类,而不是该类的对象。我想您希望newDay成为常规成员函数:
def newDay(self):
self.destroyFood()
self.randomFood()
self._tick = D
self._day += 1
换句话说,_day
不是类World
的成员,而是每个World
对象的成员。作为参考,在您的示例中,SIZE
是World
的属性,因为您已经在类范围中声明了它。
编辑: 在python中,您可以通过对象访问类属性,反之则不能。类不知道其对象,因此通过类访问对象属性毫无意义。
通常,@classmethod
装饰器用于类工厂方法(即创建和返回该类的对象)。要从该类的对象修改或检索数据,请使用常规方法。