在Python中从函数访问类变量

在Python中从函数访问类变量,python,oop,Python,Oop,我正在使用OOP编写我的第一个python游戏,我在访问类变量方面遇到了一些问题。 具体地说,我想从一个方法访问一个类变量。对于某些变量,它起作用,但对于特定的布尔变量,它不起作用: class Player(object): eaten = False def __init__(self): ..... def eat(Player): Player.eaten = True 问题在于,调用函数时,EAT不会重写类中的变量。对于其他变量,它正确

我正在使用OOP编写我的第一个python游戏,我在访问类变量方面遇到了一些问题。 具体地说,我想从一个方法访问一个类变量。对于某些变量,它起作用,但对于特定的布尔变量,它不起作用:

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()