【问题标题】:defining a variable in a class [duplicate]在类中定义变量[重复]
【发布时间】:2020-09-18 21:43:17
【问题描述】:

我试图在一个类中放置一个方法,该方法将用非空值的运行平均值替换空值。请参考以下代码:

class ElNinoData(object):
    # Your implementation here 
    add = 0
    counter = 0
    average = 0

    # methods
    def __init__(self , object):
        self.object = object

    def get_humidity(self):
        if not math.isnan(self.object['humidity']):  
            global add 
            global counter
            global average

            add += self.object['humidity']
            counter += 1
            average = add/counter
        else:
            self.object['humidity'] = average
        return self.object['humidity']

在方法中执行此类时,我收到以下错误:

<ipython-input-40-c52c3ac6484b> in get_humidity(self)
     19             global average
     20 
---> 21             add += self.object['humidity']
     22             counter += 1
     23             average = add/counter

NameError: name 'add' is not defined

谁能解释一下这个错误,我对python比较陌生?

【问题讨论】:

    标签: python python-3.x oop


    【解决方案1】:
    class ElNinoData(object):
        add = 0
    

    这里的add 不是全局变量,

                global add
    

    因此这不会提供访问它,而是寻找实际的全局。

                add += self.object['humidity']
    

    += 要求变量已经存在(以便可以添加旧值),并且您没有全局 add,也没有本地变量 - 您有一个 类属性。

    要直接访问它,您可以使用ElNinoData.add,就像使用类外代码一样。其他类属性也是如此。

    通过实例查找类属性 - self.add - 也成功。但是,修改该值然后将一个单独属性附加到实例,并且不影响类属性。

    【讨论】:

      【解决方案2】:

      如果您希望成员特定于某个对象,请将其更改为此

      class ElNinoData(object):
          # Nothing here
      
          # methods
          def __init__(self , object):
              self.add = 0
              self.counter = 0
              self.average = 0
              self.object = object
      

      并继续使用self. 引用它们。

      如果您希望它们在班级范围内使用,请将它们留在原处,但通过 ElNinoData. 引用它们。

      无论如何,你不应该在这里使用global

      【讨论】:

        【解决方案3】:

        我认为问题在于您的值 addcounteraverage 不是全局的。

        为了在您的类实例上设置这些值,您必须改用self。 像这样的:

        def get_humidity(self):
            if not math.isnan(self.object['humidity']):  
                self.add += self.object['humidity']
                self.counter += 1
                self.average = add/counter
            else:
                self.object['humidity'] = average
            return self.object['humidity']
        

        【讨论】:

          【解决方案4】:

          你在这里缺少的是你已经初始化了变量但没有给它们任何值,然后你使用 += 添加值,因为 python 会抛出这个错误。 参考以下代码:-

          class ElNinoData(object):
          # Your implementation here 
              add = 0
              counter = 0
              average = 0
          
              # methods
              def __init__(self , object):
                  self.object = object
          
              def get_humidity(self):
                  if not math.isnan(self.object['humidity']):  
                      global add 
                      global counter
                      global average
                      add = 0
                      counter = 1
                      add += self.object['humidity']
                      counter += 1
                      average = add/counter
                  else:
                      self.object['humidity'] = average
                  return self.object['humidity']
          t = {'humidity' : 10}
          a =ElNinoData(t)
          a.get_humidity()
          

          【讨论】:

          • 你的程序中不应该有全局变量。这是一种不好的做法。
          • 嗨,Tanay,您能解释一下原因吗?
          猜你喜欢
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          • 2018-04-23
          • 2012-12-02
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多