2016-07-19 4 views
1

모듈 내에서 클래스를 만들고 해당 모듈 파일을 내 컨트롤러로 가져온 다음 해당 모듈 내에서 정의 된 클래스를 참조하려고하지만 읽는 메시지가 계속 나타납니다. 여기 NameError("name 'self' is not defined")web2py에서 사용자 정의 클래스를 만드는 방법

내 코드 내 생성 모듈에 있습니다

from gluon import * 

class device_info(object): 

    self.info = {} 

    def __init__(self, info): 
     self.info = info 
     return 
    def setInfo(info): 
     self.info = info 
     return 
    def getInfo(): 
     return self.info` 

사람이 발생하고 그것이 어떻게 해결 될 수 있는지 알고 있나요? 나는 web2py에서 사용자 정의 클래스가 지원되었다는 인상을 받았다.

+1

'self.info = {}'를'__init__ '에 넣으십시오. 'self '를 마법 키워드로 생각하지 마라. 그것의 또 하나의 논쟁이다. 그것은 입력으로 받아 들여지는 메서드 밖에서 정의되지 않는다. (예 :'__init__') – Anonymous

+0

와우 ... 고마워요. @jphollowed –

+0

나는 Python에 비교적 익숙하지 않고 Java로 시작되었습니다. 나는'self'가'this'의 Python 버전이라고 가정합니다. @jphollowed –

답변

2

앞에서 설명한대로 self.info = {}__init__()으로 이동하십시오.

__init__()은 본질적으로 Java에서 익숙한 생성자입니다. 은 호출 될 때 해당 클래스의 인스턴스 객체을 초기화합니다. 나는 자바를 한동안 사용하지 않았지만 생성자 밖에서 클래스 변수를 선언해야한다고 생각하지 않는다.

self은 파이썬에서 클래스 내의 모든 메소드가 첫 번째 인수로 수신해야하는 인수입니다. 따라서 getters와 setters는 시도해도 작동하지 않습니다. 그들은해야합니다 :이 같은

def setInfo(self, info)

객체를 생성 def getInfo(self) :

device1 = device_info()

selfdevice1를 전달 __init()__ 호출합니다. device1self, 또는 사용중인 device_info 개체의 현재 인스턴스 이후 해당 개체를 사용할 때마다 그런 다음,

device1.setInfo(newInfo) 같은

, 당신은 클래스의 맥락에서 방법을 생각할 수는 setInfo(device1, newInfo)로 호출되는.

또한 클래스 정의에서 object 인수가 필요하지 않습니다. 그게 뭘 기대하니?


편집 : 사실, __init__()self.info = {}를 이동하지 않습니다가, 그냥 없애. __init__()에 이미 self.info = info이 있습니다. Java에서와 같이 Python과 같은 변수를 초기화 할 필요가 없습니다. 빈 dict을 만든 다음 아무 것도 사용하지 않고 다른 dict으로 설정하면 중복됩니다.

+0

Python에서 __new __()은 __init __()이 아닌 생성자입니다. – Waqas

+0

@Waqas 올바른,하지만 나는 _essentially_ 생성자라고 말했다. 그가 자바에서오고 평행선을 그릴 때 그를 혼동 할 필요가 없다.'__init __()'는 예상했던대로 정확하게 할 것이고, 보통'__new __()'를 쓰지 않을 것이다. – Anonymous

관련 문제