【问题标题】:Python class calling other methodPython类调用其他方法
【发布时间】:2019-02-01 07:15:16
【问题描述】:

我不明白为什么这段代码不起作用:

import numpy as np 

class Normalizer:
    def __init__(self,x):
        self.x = x 
    def mean(self):
        return np.sum(self.x)/np.size(self.x)
    def mean_zero(self):
        return self.x - self.x.mean()
    def new_calc(self):
        return self.x.mean_zero()

    a = np.random.randint(150,200,(5,8))

    heights = Normalizer(a)


    print(a)
    print(heights.mean()) 
    print(heights.mean_zero())
    print(heights.mean_zero().mean())
    print(heights.new_calc())

它正确地执行了heghts.mean_zero(),但是在def new_calc(self) 方法中它没有执行它。如果有人可以向我解释这一点,那就太好了。谢谢!

【问题讨论】:

  • mean_zero 是类方法。你不能用你的类的变量来调用它。
  • 使用self.mean_zero() 而不是self.x.mean_zero()

标签: python class methods


【解决方案1】:

我不明白为什么这段代码不起作用:

如果你运行下面的代码会报错:

AttributeError: 'numpy.ndarray' object has no attribute 'mean_zero'
  • 定位问题,唯一调用mean_zero的地方是new_calc方法。所以,第一步完成了。

  • 分析,如果你查看Normalize 类,它有一个属性x,它的类型是numpy.ndarray。如果您仔细阅读错误消息,它会说ndarray 类型没有mean_zero 属性。另一方面,您在类中定义了 mean_zero 方法,这是您应该调用的方法。

这两个步骤得出的结论是问题出在new_calc 方法中:

def new_calc(self):
    return self.mean_zero() #(wrong)return self.x.mean_zero()

【讨论】:

    【解决方案2】:

    我不确定__init__ 中的x 是什么,但很可能您实际上想在new_calc 中调用mean_zeroself 变量(同一个对象)的上下文中:

    def new_calc(self):
            return self.mean_zero()
    

    【讨论】:

      【解决方案3】:

      将 self.x.mean_zero() 写入 self.mean_zero()

      import numpy as np 
      
      class Normalizer:
         def __init__(self,x):
             self.x = x 
         def mean(self):
             return np.sum(self.x)/np.size(self.x)
         def mean_zero(self):
             return self.x - self.mean()
         def new_calc(self):
             return self.mean_zero()
      
      a = np.random.randint(150,200,(5,8))
      
      heights = Normalizer(a)
      
      
      print(a)
      print(heights.mean()) 
      print(heights.mean_zero())
      print(heights.mean_zero().mean())
      print(heights.new_calc())
      

      【讨论】:

        【解决方案4】:

        您正在使用 'a' 初始化 Normalizer,它是 np.random.randint 的输出,它返回一个 numpy.ndarray 对象。

        在 new_calc 方法中,您尝试调用 ndarray 对象的 mean_zero 方法,但 ndarray 没有这样的方法。 mean_zero Normalizer 上的一个方法,但是 self.x 不是 Normalizer 类型。

        我不确定这段代码new_calc 应该做什么。如果您能说得更清楚些,我或许可以提供更多帮助。

        【讨论】:

        • new_calc 只是对调试我实际想要完成的工作的简化。实际代码如下所示: def variance(self): return (np.sum((self.x.mean_zero()**2)))/ np.size(self.x)
        【解决方案5】:

        罪魁祸首:

        def new_calc(self):
                return self.x.mean_zero()
        

        原因:

        self.xNormalizer 类的一个属性。所以如果heightsNormalizer 类的一个实例,那么heights.x 就是self.x

        答案:

        def new_calc(self):
                return self.mean_zero()
        

        理由:

        AttributeError: 'numpy.ndarray' 对象没有属性 'mean_zero'

        ndarray 没有这种方法。 mean_zero 是 Normalizer 的一种方法

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          • 2017-06-25
          • 2013-12-26
          • 2014-12-10
          相关资源
          最近更新 更多