반응형

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
>>> 
 







** 파이썬은 다중상속 가능...





반응형
Posted by 자유프로그램
,