我正在使用OOP编写我的第一个python游戏,但在访问类变量时遇到一些问题。 具体来说,我想从方法访问类变量。对于某些变量,它起作用,但是对于特定的布尔变量,它不起作用:
class Player(object):
eaten = False
def __init__(self):
.....
def eat(Player):
Player.eaten = True
问题在于,当调用函数时, eaten 不会覆盖类中的变量。对于其他变量,它可以正确执行我想要的操作。
编辑:
如果在类播放器的方法内部,我在调用print(self.eaten)
之后添加了eat()
,它仍然始终打印False
class Player(object):
eaten = False
def move():
print(self.eaten)
def eat(Player):
Player.eaten = True
谢谢!
答案 0 :(得分:3)
eaten
应该是一个实例变量,而不是一个类变量-您可以吃掉一些玩家而其他人则不能,并且将其作为类变量意味着它将影响所有玩家,这可能不是您想要的
class Player(object):
def __init__(self):
self.eaten = False
def move(self):
if self.eaten:
print("I have eaten so I can move")
else:
print("I can't move! I'm hungry!")
def eat(player, food):
player.eaten = True # change `eaten` for the player
# passed as parameter!
>>> p = Player() # creates a instance of the Player class
>>> q = Player() # creates another instance of the Player class
>>> eat(p, 'apple') # player `p` eates apple
>>> p.move()
I have eaten so I can move
>>> q.move()
I can't move! I'm hungry!
print(p.eaten) # will print True
print(q.eaten) # will print False
答案 1 :(得分:0)
调用函数时,您传递的是对象而不是类。因此,您正在实例上分配变量。将功能更改为
def eat(玩家): type(player).eaten = True
其中type(player)
返回实际的Player
类
答案 2 :(得分:0)
创建类时,您想为此类内容创建实例变量。实例变量是对于要创建的Class的每个实例可以不同的变量。为此,您可以在init方法中将其定义为变量“ self.var”,就像这样
class Player(object):
def __init__(self):
self.eaten = False
这会将每个新的Player实例的eaten
的默认值设置为False
。每当我们执行诸如foo = Player()
之类的操作时,都会有一个诸如foo.eaten
之类的实例变量,其默认值为False
。现在,如果要使用一种方法来更新它,我们需要引用我们正在更新其实例变量的Player
的实例,通常使用名为self
class Player(object):
def __init__(self):
self.eaten = False
def eat(self):
self.eaten = True
现在,当我们执行foo.eat()
时,Python会将foo
作为函数eat
的第一个参数传递,这意味着self.eaten
实际上正在查看foo.eaten
。因此,当我们说self.eaten = True
时,我们会将foo.eaten
的实例变量设置为True
。