【问题标题】:Python OO -- class member has NoneTypePython OO——类成员具有 NoneType
【发布时间】:2012-02-21 20:59:30
【问题描述】:

我正在将一些 Python 代码转换为 OO 代码。我定义了一个类和一个两个参数的构造函数。

class myclass:
     MAX=5000
     FTOL = 10**(-10)
     TINY = 10**(-10)
     def __init__(self, initPt_,fun_):
         self.initPt = initPt_
         self.fun = fun_

有了这段代码,我希望 initPt 和 fun 成为班级成员。我执行代码并在 shell 中编写此实例:

x=myclass([1,1],Optim.fun1)

其中 fun1 是模块 Optim 中定义的函数,我准确地导入了该函数。

我在 myclass 中添加了一个函数:

def build(self):
    self.initPt=self.initPt.append(self.fun(self.initPt))
    s=[self.initPt]
    for k in range(len(self.initPt)):
        temp=[x for x in self.initPt]
        temp[k]=self.initPt[k]+1
        s.append(temp)
    return s  

我在刚刚创建的实例 x 上调用方法 build。出现这个错误:

for k in range(len(self.initPt)):
TypeError: object of type 'NoneType' has no len()

事实上,如果我在代码中添加这个测试行:

print str(type(self.iniPt))

shell 表示类型是 NoneType,尽管我用 self.initPt = [1,1] 实例化了 x。

此外,如果我在 shell 中编写 x.initPt,结果是准确的:[1,1,0.2](调用方法 build 后,将第三个值添加到初始列表 [1,1])。

我不明白为什么它不能动态解析类型。这不是对象编程。我该怎么办?

感谢和问候。

【问题讨论】:

  • 只是一点点惯用改进:temp = self.initPt[:]; temp[k] += 1。还有一个提示:PEP 8.

标签: python oop class attributes instance


【解决方案1】:

这至少是你问题的一部分:

self.initPt=self.initPt.append(self.fun(self.initPt))

使用列表的append 方法修改列表并返回None。所以这会将分配给self.initPt 的列表替换为None。只需这样做:

self.initPt.append(self.fun(self.initPt)) 

【讨论】:

    【解决方案2】:

    这是你的问题:

    self.initPt=self.initPt.append(self.fun(self.initPt))
    

    在这里,您清除了您的列表并用None 替换它。 append() 不返回任何内容。

    【讨论】:

      【解决方案3】:

      我......很难按照你的意图行事,但问题出在这一行:

      self.initPt=self.initPt.append(self.fun(self.initPt))
      

      您正在尝试将self.initPt.append 的返回值分配给self.initPt。列表的append() 方法向列表添加一个值,但返回无。你失去了self.initPt

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2012-09-06
        • 1970-01-01
        • 2015-11-01
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多