2012-02-21 2 views
0

일부 Python 코드를 OO 코드로 변환하고 있습니다. 클래스와 두 개의 인수 생성자를 정의합니다.Python OO - 클래스 멤버가 NoneType을 가짐

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

이 코드를 사용하면 initPt와 fun가 클래스 멤버가 될 것으로 예상됩니다. I 코드를 실행하고 쉘이 instanciation 해주기 I 정확하게 가져온 것이

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

fun1 모듈 Optim을 정의하는 함수이다. 내가 방금 만든 x를 인스턴스에 구축 메서드를 호출

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 

:

나는 함수를 MyClass에 추가되었습니다. 이 오류가 나타납니다

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

과 실제로 내가 코드에서이 테스트 라인을 추가하는 경우 :

print str(type(self.iniPt)) 

쉘은 내가 self.initPt = [1,1와 X를 통해 인스턴스 althought, 그 유형은 NoneType을 나타냅니다 ].

또한 x.initPt를 쉘에 쓰면 결과가 정확합니다. [1,1,0.2] (메소드 빌드 호출 후 초기 목록 [1,1]에 세 번째 값이 추가됨).

왜 유형을 동적으로 해석하지 않는지 이해할 수 없습니다. 그렇다면 객체 프로그래밍이 아닙니다. 어떻게해야합니까?

감사합니다.

+1

관용적 인 개선의 단지 작은 비트 :'temp = self.initPt [:]; 임시 [k] + = 1 '. 그리고 힌트 : [PEP 8] (http://www.python.org/dev/peps/pep-0008/). –

+0

좋은 참조, 감사합니다. – octoback

답변

2

이 문제의 적어도 일부입니다 목록의 append 방법을 사용하여

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

장소에서 목록을 수정하고 None를 반환합니다. 따라서 self.initPt에 할당 된 목록을 None으로 바꿉니다. 그냥 이렇게 : 바로 여기 당신이 당신의 목록을 닦고 None로 대체

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

:

self.initPt.append(self.fun(self.initPt)) 
+0

감사합니다. – octoback

1

이 당신의 문제입니다. append() 아무 것도 반환하지 않습니다.

0

나는 ... 당신의 의도를 다음과 힘든 시간을 가지고 있지만 문제는이 라인에 : 당신은 self.initPtself.initPt.append의 반환 값을 할당하려고 시도하고

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

. append() 목록의 메서드는 값을 목록에 추가하지만 없음을 반환합니다. 당신은 self.initPt을 잃었습니다.