在Python中从函数访问类变量
我正在使用OOP编写我的第一个python游戏,我在访问类变量方面遇到了一些问题。 具体地说,我想从一个方法访问一个类变量。对于某些变量,它起作用,但对于特定的布尔变量,它不起作用:在Python中从函数访问类变量,python,oop,Python,Oop,我正在使用OOP编写我的第一个python游戏,我在访问类变量方面遇到了一些问题。 具体地说,我想从一个方法访问一个类变量。对于某些变量,它起作用,但对于特定的布尔变量,它不起作用: class Player(object): eaten = False def __init__(self): ..... def eat(Player): Player.eaten = True 问题在于,调用函数时,EAT不会重写类中的变量。对于其他变量,它正确
class Player(object):
eaten = False
def __init__(self):
.....
def eat(Player):
Player.eaten = True
问题在于,调用函数时,EAT不会重写类中的变量。对于其他变量,它正确地执行了我想要的操作
编辑:
如果在类player中的一个方法中,在调用eat()
之后添加print(self.eat)
,它仍然总是打印False
class Player(object):
eaten = False
def move():
print(self.eaten)
def eat(Player):
Player.eaten = True
谢谢大家! 调用函数时,传递的是对象,而不是类。因此,您正在实例上分配变量。将您的函数更改为 def eat(玩家): type(player).True=True
其中
type(player)
返回实际的player
class当您创建一个类时,您需要为类似这样的东西创建实例变量。实例变量是针对所创建类的每个实例可以不同的变量。可以通过在init方法中将其定义为变量“self.var”来实现,如下所示
class Player(object):
def __init__(self):
self.eaten = False
这将玩家的每个新实例的默认值设置为False
。每当我们执行类似于foo=Player()
的操作时,就会有一个类似于foo.eat
的实例变量,它默认为False
。现在,如果我们想用一个方法更新它,我们需要引用Player
的实例,我们正在更新它的实例变量,通常使用名为self
class Player(object):
def __init__(self):
self.eaten = False
def eat(self):
self.eaten = True
现在,当我们执行foo.eat()
时,Python将foo
作为第一个参数传递给函数eat
,这意味着self.eat
实际上是在查看foo.eat
。因此,当我们说self.eat=True
时,我们将foo.eat
的实例变量设置为True
eat
应该是一个实例变量,而不是一个类变量-您可以让一些玩家被吃掉,而其他玩家则不被吃掉,将其作为类变量意味着它将影响所有玩家,这可能不是您想要的
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
“”您所说的是什么意思?对于其他变量,它正确地执行了?你确定吗?如果我复制并粘贴你的代码(给\uuuu init\uuuu
一个通行证)并调用eat(Player)
然后print(Player.eat)
我看到True
…是的,我肯定,因为在Player
中的一个附加方法中,当我print(eat)
时,它总是打印False,即使在eat()之后
被称为def eat()
需要在类之外,因为我实际上在类中传递了两个类,所以我不能在其他类中执行。确实是defeat(玩家,食物)
@MauroComi好的,我编辑了我的答案,但这让人困惑!您应该传递实例,而不是类,并且应该为实例使用小写变量名。看看我的答案。@Maurrock如果你已经按照你的建议去做了,也许你会对它有所帮助。它是一个类外的方法,已经Player.eat=True
@MauroComi:你如何调用该函数??在主eat(player1)
中,是player1=Player()