【问题标题】:How to check if a variable's value has changed如何检查变量的值是否已更改
【发布时间】:2021-01-14 19:35:09
【问题描述】:

如果我有一个变量:

var = 5

我想在变量的值发生变化时检测并跳转到一个函数,所以如果var不等于之前的值,我想跳转到一个函数。

最简单的方法是什么?

另一个例子:

from datetime import datetime
import time


def dereferentie():
    currentMinute = datetime.now().minute
    checkMinute(currentMinute)

def checkMinute(currentMinute):

    #if currentMinute has changed do:
        printSomething()

def printSomething():
    print "Minute is updated"


def main():
    while (1):
        dereferentie()


if __name__ == '__main__':
    main()

【问题讨论】:

  • ...您是否正在寻找if 声明?
  • var 是全局变量还是属于某个类?
  • var 属于一个类
  • 您问了两个略有不同的问题...您是希望在变量值发生变化时立即执行函数,还是只想进行比较(没有特定时间)变量的当前值到某个较早的值?

标签: python variables


【解决方案1】:

基于@HelloWorld 的回答和@drIed 的评论:一个不错的方法是将其包装到一个类中。

例如:

class Watcher:
    """ A simple class, set to watch its variable. """
    def __init__(self, value):
        self.variable = value
    
    def set_value(self, new_value):
        if self.variable != new_value:
            self.pre_change()
            self.variable = new_value
            self.post_change()
    
    def pre_change(self):
        pass # do stuff before variable is about to be changed
        
    def post_change(self):
        pass # do stuff right after variable has changed
        

【讨论】:

    【解决方案2】:

    我会使用触发您所需功能的 setter 函数。

    def setValue(val):
        global globalVal
        valueChanged= g_val != val
        if valueChanged:
            preFunction()
        globalVal = val
        if valueChanged:
            postFunction()
    

    【讨论】:

      【解决方案3】:

      一个很好的方法是使用 @property@.setter 装饰器。

      class MyClass:
          @property
          def property_name(self):
              return self.some_value
      
          @property_name.setter
          def property_name(self, new_value):
             self.some_value = new_value
      
      obj = MyClass()
      obj.property_name = "New Value"
      stored_value = obj.property_name
      

      顺便说一句,这是我最喜欢的 Python 功能之一。

      原创海报 以下是我将如何实现您的示例。

      from datetime import datetime
      
      class TimeManager:
          # The actual variable holding data
          # You don't need to declare it, but I like to
          _current_minute = None
      
          @property
          def current_minute(self):
              """Retrieve the local variable value."""
              return self._current_minute
          @current_minute.setter
      
          @current_minute.setter
          def current_minute(self, value):
              """Same method name, but set the local variable."""
              self._current_minute = value
              print("Minute has updated to {}".format(self._current_minute))
      
          @current_minute.deleter
          def current_minute(self):
              """You can also delete variables."""
              del self._current_minute
      
      
      def main():
          # Create the class
          time_manager = TimeManager()
          for i in range(100):
              current_minute = datetime.now().second
              # set the .currrent_minute using a @property
              time_manager.current_minute = current_minute
      
      
      if __name__ == '__main__':
          main()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-10
        相关资源
        最近更新 更多