【问题标题】:Creating a variable in Python and assigning it to the last call of a function without calling the function again在 Python 中创建一个变量并将其分配给函数的最后一次调用,而无需再次调用该函数
【发布时间】:2014-10-10 06:31:52
【问题描述】:

所以我创建了一个非常简单的温度类,可以将给定的温度从摄氏温度转换为华氏温度,反之亦然。问题是我想在类中有一个“convert”方法,如果直接调用则执行,但如果分配给变量则不执行。这是我的代码:

class Temperature:
    def __init__(self,temp=None,cf='C'):
        if temp == None:
            self.temp = float('0.0')
        else:
            try:
                self.temp = float("{0:.2f}".format(temp))
            except:
                print('Your temperature must be a number!')              
        if cf not in ['c','C','f','F']:
            print('You must identify the temperature as either F for Fahrenheit or C for Celsius!')
        else:
            self.cf = cf.upper()
    def convert(self):
        if self.cf == 'F':
            self.temp = float("{0:.2f}".format((self.temp - 32) * 5 / 9))
            self.cf = 'C'
            return(self)
        elif self.cf == 'C':
            self.temp = float("{0:.2f}".format((9/5)*self.temp + 32))
            self.cf = 'F'
            return(self)
    def __repr__(self):           
        return('Temperature({},{})'.format(self.temp,self.cf))

结果:

>>>t1 = Temperature()
>>>t1
Temperature(0.0,C)
>>>t2 = Temperature(100,'f')
>>>t2
Temperature(100.0,F)
>>>t3 = t3 = Temperature('12.5','c')
>>>t3
Temperature(12.5,C) #works fine up to here

>>>t1.convert()
Temperature(32.0,C) #converts when called - just what I want
>>>t4 = t1.convert() #Should set t4 equal TO VALUE of 't1.convert()' without rerunning method
>>>t4
Temperature(0.0,C) #THIS IS WHERE I GET LOST. I want t4 to print out 'Temperature(32.0,C)' Ideas?

【问题讨论】:

  • 方法无法知道其返回值是否被分配给结果。您可以让convert 存储它的最后一个返回值并在下次再次返回它,但是没有办法告诉它只在其结果未分配给变量时才这样做。第一次调用方法的时候,为什么不直接把结果赋值给一个变量呢?
  • 我认为您的示例中的意思是Temperature(0.0, *F*)。此外,尚不清楚为什么您希望对convert() 的调用不会转换;这违反了该类 API 的最小惊讶原则。为什么不保持原样? convert() 转换对象的同时也返回自身,这样就可以链式调用了。
  • 您应该重新考虑您的方法,例如,您可以定义CF 相应返回CelsiusTemperature 或FahrenheitTemperature 的属性(也有@ 987654330@ 和 F 属性)。

标签: python python-3.x


【解决方案1】:

一种方法是创建Temperature 的新实例并为其分配转换后的值,而不修改Temperature 的当前实例的值:

    def convert(self):
        if self.cf == 'F':
            return Temperature(float("{0:.2f}".format((self.temp - 32) * 5 / 9)), 'C')
        elif self.cf == 'C':
            return Temperature(float("{0:.2f}".format((9/5)*self.temp + 32)))

结果:

>>>t1 = Temperature()
>>>t1
Temperature(0.0,C)
>>>t1.convert()
Temperature(32.0,C)
>>>t1
Temperature(0.0,C)
>>>t4 = t1.convert()
>>>t4
Temperature(32.0,C)

【讨论】:

    【解决方案2】:

    考虑到这一点,当您再次调用 t1.convert() 时,它会更改 self.cf 的值, 所以它下次运行 if 条件并返回实例。

    t1 = Temperature()
    
    print t1.convert()
    print '======='
    print t1.convert()
    print '======='
    t4 = t1.convert()
    print t4
    

    输出:-

    C
    Temperature(32.0,F)
    =======
    F
    Temperature(0.0,C)
    =======
    C
    Temperature(32.0,F)
    

    【讨论】:

      【解决方案3】:

      也许你可以做这样的事情?

      class TemperatureError(Exception):
          pass
      
      
      class Temperature(object):
          def __init__(self, temp=None, scale='C'):
              self._celcius = None
              self._fahrenheit = None
              if temp:
                  if scale in ('c', 'C'):
                      self.celcius = temp
                  elif scale in ('f', 'F'):
                      self.fahrenheit = temp
                  else:
                      raise TemperatureError
      
          @property
          def celcius(self):
              return self._celcius
      
          @celcius.setter
          def celcius(self, temp):
              self._celcius = float('{0:.2f}'.format(temp))
              self._fahrenheit = float('{0:.2f}'.format((temp - 32) * 5 / 9))
      
          @property
          def fahrenheit(self):
              return self._fahrenheit
      
          @fahrenheit.setter
          def fahrenheit(self, temp):
              self._celcius = float('{0:.2f}'.format(temp * 9 / 5 + 32))
              self._fahrenheit = float('{0:.2f}'.format(temp))
      

      结果会是这样的:

      >>> t = Temperature(20, 'F')
      >>> t.fahrenheit
      20.0
      >>> t.celcius
      68.0
      

      【讨论】:

        猜你喜欢
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 2015-02-06
        • 1970-01-01
        • 2017-02-02
        相关资源
        最近更新 更多