因此,当我更改可变健康状况时,我会尝试通过打印“您的健康状况为%s”来告知用户其健康状况已更改。这是它的样子...
health=5
def start():
global health
health+=2
因此,我想知道是否有一种方法可以向用户提供某种不在功能start()
内但不在其内部的总体功能,以便每次更改变量运行状况时都将其打印出来?我正在学习python,所以不要判断!
答案 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'
很漂亮:它会导致up
或down
被格式化,具体取决于数字是否为正。
格式字符串表示每个{}
将被替换为.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