Python OO - 类成员具有NoneType

时间:2012-02-21 20:59:30

标签: python oop class attributes instance

我正在将一些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中编写此instanciation:

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上调用方法构建。出现此错误:

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](在调用方法构建之后,第三个值被添加到初始列表[1,1])。

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

谢谢和问候。

3 个答案:

答案 0 :(得分:2)

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

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

使用列表的append方法修改列表并返回None。因此,这将使用self.initPt替换分配给None的列表。就这样做:

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

答案 1 :(得分:1)

这是你的问题:

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

就在这里,您清除了列表并将其替换为Noneappend()不会返回任何内容。

答案 2 :(得分:0)

我......按照你的意图度过艰难时期,但麻烦在于这一点:

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

您正在尝试将self.initPt.append的返回值分配给self.initPt。列表的append()方法将值添加到列表中,但返回None。你丢失了self.initPt