我正在将一些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])。
我不明白为什么它没有动态解析类型。那不是对象编程。我该怎么办?
谢谢和问候。
答案 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))
就在这里,您清除了列表并将其替换为None
。 append()
不会返回任何内容。
答案 2 :(得分:0)
我......按照你的意图度过艰难时期,但麻烦在于这一点:
self.initPt=self.initPt.append(self.fun(self.initPt))
您正在尝试将self.initPt.append
的返回值分配给self.initPt
。列表的append()
方法将值添加到列表中,但返回None。你丢失了self.initPt
。