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
>>>
** 파이썬은 다중상속 가능...