从Python中的函数访问类变量

时间:2018-07-19 13:29:35

标签: python oop

我正在使用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

谢谢!

3 个答案:

答案 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