Python OO - член класса имеет NoneType - PullRequest
0 голосов
/ 22 февраля 2012

Я превращаю часть кода 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 будут участниками класса.Я выполняю код и записываю этот экземпляр в оболочку:

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  

Я вызываю метод build на экземпляре x, который я только что создал.Появляется эта ошибка:

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

и действительно, если я добавлю эту тестовую строку в коде:

print str(type(self.iniPt))

shell означает, что типом является NoneType, хотя я создал экземпляр x с self.initPt =[1,1].

Более того, если я напишу x.initPt в оболочке, результат будет точным: [1,1,0.2] (после вызова сборки метода третье значение добавляется в начальный список [1,1]).

Я не понимаю, почему он не разрешает тип динамически.Это не объектное программирование.Что мне делать?

Спасибо и всего наилучшего.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

Это как минимум часть вашей проблемы:

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

Использование метода списка append изменяет список на месте и возвращает None.Таким образом, этот список заменяет self.initPt на None.Просто сделайте это:

self.initPt.append(self.fun(self.initPt)) 
1 голос
/ 22 февраля 2012

Это ваша проблема:

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

Здесь вы уничтожили свой список и заменили его на None.append() ничего не возвращает.

0 голосов
/ 22 февраля 2012

Мне ... нелегко следовать вашим намерениям, но проблема в этой строке:

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

Вы пытаетесь присвоить возвращаемое значение self.initPt.append для self.initPt.Метод append() списка добавляет значение в список, но возвращает None.Вы потеряли self.initPt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...