【问题标题】:Every time variable is changed,i want certain function to be executed每次更改变量时,我都希望执行某些功能
【发布时间】:2019-02-27 09:46:41
【问题描述】:

因此,当我更改变量健康时,我试图通过打印“您的健康是 %s”来通知用户他们的健康已经改变。这是它的样子......

health=5

def start():         
  global health
  health+=2

所以我想知道是否有一种方法可以通过某种总体功能通知用户,该功能不在此功能start() 内但在其外部,以便每次更改变量运行状况时都会打印那个和那个?我正在学习python所以不要评判!

【问题讨论】:

  • 最简单的方法可能是创建一个改变健康的函数,它对值进行调整,然后做你想做的任何其他事情。然后在运行状况发生变化时调用此函数,而不是直接改变值。 (PS 如果这个项目达到任何规模,你最好使用类而不是全局函数/变量)
  • 谢谢,我一定会这样尝试的!它更有意义,因为它只是以这种方式使事情复杂化!我是新手,所以我认为有一些东西可以轻松解决!

标签: python function global-variables


【解决方案1】:

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

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

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

【讨论】:

  • 这可能是更好的解决方案,但对于 OP 而言,这似乎有点矫枉过正,特别是因为他/她是 Python 新手,这可能超出了他/她的理解范围。
  • @NChauhan 我同意您的担忧,但是 stackoverflow 上的答案适用于该问题的所有未来读者,包括未来版本的 OP!
  • 属性不是更好的解决方案吗?然后你不需要单独处理所有属性,所以如果你决定向 Player 类添加更多属性,那么麻烦就不会那么多了。
  • 当您需要 getter 时,@AlexanderSimko 属性会更好。请参阅this 答案。
  • 不用担心,谢谢,我会努力理解,我正在从“Learn python the hard way”中学习,鼓励寻找新东西并尝试理解它,尽管我认为有一些简单的答案......
【解决方案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)

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

格式字符串意味着每个{} 将被替换为.format() 调用中各自位置的任何值。

【讨论】:

    【解决方案3】:
    health=5
    
    def start():
        new_health= health +2
        print new_health, health
    

    我相信这就是您正在寻找的。由于您的变量是全局变量,因此可以在程序中的任何位置进行更改。因此,通过打印两者,您可以看到您的原始健康状况没有改变。

    【讨论】:

      【解决方案4】:

      我们可以创建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 的方法

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 1970-01-01
        相关资源
        最近更新 更多