每次更改变量时,我都希望执行某些功能

时间:2018-09-23 20:13:00

标签: python function global-variables

因此,当我更改可变健康状况时,我会尝试通过打印“您的健康状况为%s”来告知用户其健康状况已更改。这是它的样子...

health=5

def start():         
  global health
  health+=2

因此,我想知道是否有一种方法可以向用户提供某种不在功能start()内但不在其内部的总体功能,以便每次更改变量运行状况时都将其打印出来?我正在学习python,所以不要判断!

4 个答案:

答案 0 :(得分:3)

通过使用带有自定义Player钩子的__setattr__类,我们可以做得比您尝试做的要好。

class Player:
    def __init__(self):
        vars(self)['health'] = 100 # suppress __setattr__

    def __setattr__(self, attr, value):
        if attr == 'health':
            print('health changed to {}'.format(value))
        super().__setattr__(attr, value)

当然,您可以根据需要扩展此类。例如,您可以添加name属性并打印'{}'s health changed to {}'.format(self.name, value)

演示:

>>> p = Player()
>>> p.health
100
>>> p.health += 2
health changed to 102

作为奖励,您现在可以同时拥有多个健康水平不同的玩家,而不必管理全局变量。

答案 1 :(得分:2)

我认为最简单的方法是在代码中的某个位置定义一个函数:

health = 5
def main():
    global health
    def change_health(amount):
        health += amount
        print('your health went {} by {}'
              .format('up' if amount > 0 else 'down',
                      abs(amount)))

    change_health(-2)

此函数使用全局变量运行状况并对其进行更改。然后,如前所述,它会打印出该消息。我认为行'up' if amount > 0 else 'down'很漂亮:它会导致updown被格式化,具体取决于数字是否为正。

格式字符串表示每个{}将被替换为.format()调用中放置在其相应位置的任何值。

答案 2 :(得分:0)

health=5

def start():
    new_health= health +2
    print new_health, health

我相信这就是您想要的。由于您的变量是全局变量,因此可以在程序中的任何位置进行更改。因此,通过同时打印这两个变量,您可以看到原来的运行状况没有改变。

答案 3 :(得分:0)

我们可以创建int的子类型。

class Health(int):
    def __new__(cls, value):
        return int.__new__(cls, value)
    def __iadd__(self, other):
        print(f"+{other} health")
        return self.__class__(self + other)
    def __isub__(self, other):
        print(f"-{other} health")
        return self.__class__(self - other)

这有点复杂,但是很有趣。

In [1]: h = Health(10)

In [2]: h += 2
+2 health

In [3]: h -= 3
-3 health

In [4]: h
Out[4]: 9

但是我更喜欢@timgeb