self, 클래스멤버(변수) , 인스턴스멤버(변수), 생성자, 소멸자
테스트 환경 : windows 7 64bit, python 2.7.7
멤버(Member) --- 변수 (멤버변수)
메소드 (Method) --- 함수
속성(Attribute) -- Member + Method (즉, 변수 + 함수)
인스턴스 (instance) --- class 로 만든 객체 (= 인스턴스객체)
; 인스턴스 만들기 전에는 class를 사용할 방법이 없다고 생각하라. (예외도 있지만..)
클래스내 메소드호출시에는 메소드명 앞에 self.을 붙여서 호출한다.. (약속...)
메소드의 첫매개변수는 무조건 self !!! (약속...)
** 멤버(member) == 변수(멤버변수)
클래스멤버(변수) ; 클래스이름.변수 ---> AA.cm
-- 클래스선언과 메소드선언 사이에 존재하는 변수
인스턴스멤버(변수) ; 인스턴스명.변수 --> aa.cm, bb.cm
-- 기본적으로 self 가 붙은 변수 (self.cm)
-- 클래스 namespace 전체 scope에서 호출할수있는 변수는 인스턴스변수와 글로벌변수
# -*- coding: euc-kr -*- class AA: cm = 123 # 클래스멤버(변수) --- 처음에는... 왠만하면 사용하지 마라!!! # 타 언어의 static 변수처럼 생각!! # # AA.cm (즉, 클래스이름.cm) 형식으로만 사용하자.... # ; 인스턴스 들이 공유하는 변수만 사용하자... # # aa.cm, bb.cm 등 인스턴스명.cm으로도 사용사능하지만..사용하지말자.. # ; 인스턴스명.cm (= 인스턴스변수)로 불러들일때 , # 해당 인스터스변수 없으면 -> 클래스변수에서 찾는다. # ; 즉 인스턴스변수(aa.cm)이 없으면 클래스변수(AA.cm)에 있는 값을 불러온다. print cm def fx(self): # 메소드의 첫매개변수는 무조건 self b= 33 # 로칼변수 (fx 메소드 내에서만 사용가능) self.im = 444 # 인스턴스멤버(변수) -- self. 붙은 변수... class 전체 내에서 호출가능.. print 'b = ',b print 'fx self.im = ',self.im def fx2(self): print 'fx2 self.im = ',self.im >>> aa = AA() >>> bb= AA() >>> aa.cm # 인스턴스멤버(변수) -- self.cm 을 찾으나 없으므로 AA.cm 을 찾아서 반환한다.. 123 >>> bb.cm 123 >>> AA.cm # 클래스멤버(변수) 123 >>> dir(aa) ['__doc__', '__module__', 'cm', 'fx', 'fx2'] >>> dir(AA) ['__doc__', '__module__', 'cm', 'fx', 'fx2'] >>> aa.cm = 555 # 이경우는 인스턴스멤버 aa.cm 가 없으면 인스턴스멤버 aa.cm 을 만들어서 555 를 대입한다. >>> aa.cm # 이제는 윗줄에서 만든 aa.cm 이라는 인스턴스멤버가 있으므로, 인스턴스멤버 aa.cm (555)를 불러온다. 555 >>> bb.cm # 인스턴스멤버(변수) -- 인스턴스멤버 bb.cm(self.cm) 을 찾으나 없으므로 클래스멤버 AA.cm 반환. 123 >>> AA.cm # 클래스멤버(변수) 123 >>> dir(aa) ['__doc__', '__module__', 'cm', 'fx', 'fx2'] >>> dir(bb) ['__doc__', '__module__', 'cm', 'fx', 'fx2'] >>> dir(AA) ['__doc__', '__module__', 'cm', 'fx', 'fx2'] >>>
** 생성자, 소멸자
- 생성자 : __init__ --> 인스턴스객체 생성시 자동초기화함수...
; 다른 언어와 달리 필수 사항아니고.. python이 자동으로 만들지도 않음..
- 소멸자 : __del__ ---> 실제로 사용할일 없음..(garbage collection 때문에)
# -*- coding: euc-kr -*- # cm = 'global var' # 글로벌 변수 class AA: cm = 123 # 클래스멤버(변수) def __init__(self): # 생성자, 메소드의 첫매개변수는 무조건 self b= 33 # 로칼변수 ( __init__() 내에서만 사용가능 ) self.im = 444 # 인스턴스멤버(변수) -- self. 붙은 변수... class 전체 내에서 호출가능.. self.cm = 222 # 인스턴스멤버 -- but, 클래스멤버와 같은 이름은 사용하지 말자.. print ' contructor !!' self.fx() # class 내의 다른 메소드 호출시에는 앞에 self. 붙여서 호출.. def fx(self): # 메소드의 첫매개변수는 무조건 self c= 333 # 로칼변수 (fx 메소드 내에서만 사용가능) self.val = 555 print 'self.im = ',self.im # print cm # global 변수 cm을 찾는다. ( 즉, class 밖 모듈에서 찾는다.) # print b # global 변수 b를 찾는다. ( 즉, class 밖 모듈에서 찾는다.) # -- self 자리에는 인스턴스명이 온다고 생각하라!!!! >>> aa = AA() # 인스턴스 만들때 생성자 실행됨.. contructor !! self.im = 444 >>> aa.im # self.im 444 >>> aa.cm # self.cm ---> 인스턴스변수 self.cm 이 없다면, 클래스변수 AA.cm 에서 값 가져온다.. 222 >>> AA.cm # 클래스멤버(변수) 123 >>> aa.fx() # method 호출 self.im = 444 >>> aa.__init__() # 생성자 호출 contructor !! self.im = 444 >>>
#-*- coding: euc-kr -*- class AA: cm = 123 # 클래스멤버(변수) print ' 클래스멤버 영역' def __init__(self): print ' contructor !!' self.a = '한글' # 인스턴스멤버 self.fx() def fx(self): print ' len of self.a == ', len(self.a) pass def fx2(self): k = unicode(self.a, 'euc-kr') # euk-kr 코드로 된 self.a를 unicode로 변환하라. print ' len of unicode k == ', len(k)
*** 상속
#-*- coding: euc-kr -*- class MyCalc(object): def __init__(self): print 'MyCalc...' def hap(self,a,b): return a+b def kop(self,a,b): # overide pass class MyCalc2(MyCalc): def __init__(self): MyCalc.__init__(self) # 현재는 생략해도 관계없다. print 'MyCalc2...' def kop(self,a,b): # overide # only for positive integer result=0 if b >= 1: for x in range(b): result = self.hap(a,result) # hap 메소드는 부모class에 있다.. else: result = 0 return result def seung(self,a,b): # only for positive integer result = 1 if b >= 1: for x in range(b): result = self.kop(a,result) else: result = 1 return result
>>> aa = MyCalc2() MyCalc... MyCalc2... >>> >>> aa.kop(2,4) 8 >>> >>> aa.seung(3,4) 81 >>> >>> aa.hap(3,9) 12 >>>
** 파이썬은 다중상속 가능...
'python' 카테고리의 다른 글
python debugging -- exception 발생한 file name, line number 찾기 (0) | 2014.09.19 |
---|---|
bioinfomatics -- vienna format 으로 RNA 그리기 (0) | 2014.09.02 |
python anagram --- timeit 실행시간 확인 (0) | 2014.08.24 |
python 으로 github api v3 접근하기 -- httplib (0) | 2014.08.22 |
base64 encoding , decoding (0) | 2014.08.21 |