본문 바로가기

Script/Python

16. Class

파이썬에서의 클래스
 
- 파이썬에서 클래스를 정의하면 클래스 객체가 이름공간에 생성이 되고 모든 인스턴스들이 이를 참조하게 된다.
 
- 그렇기 때문에 인스턴스 객체에 개인적인 멤버를 추가할 수 있다.
 
- 인스턴스 객체를 만든후 인스턴스 객체가 변경되기 전까지는 클래스 객체와 동일한 데이터와 메서드를 가리킨다. 
 
- 클래스 멤버함수 클래스 멤버 변수는 클래스 객체의 공간에 형성이 되고 모든 객체에서
 
  클래스명.클래스 멤버변수 
 
  클래스명.클래스 멤버함수 
 
  형태로 접근할 수 있다.
 
 
클래스 선언 
 
- 최상위 클래스는 파이썬 모든 타입의 루트인 object 를 상속받는 것이 좋다.
 
class Cal(object):
    pass
 
 
클래스 사용
 
아래와 같이 만들수 있다.
 
class Cal(object):
    pass
 
c1 = Cal()
 
 
생성자 소멸자
 
생성자는 __init__ 함수를 사용하는데
 
__init__ 함수의 첫번째 매개변수 값은 c1, c2 처럼 인스턴스 자체가 된다.
 
항상 self 로 넣는다고 생각하면 되겠다.
 
하지만 실제 콜에서는 이는 인자로 넣지 않는다. ( 자동으로 들어간다고 보자 )
 
소멸자는 __del__ 함수를 사용한다.
 
class Cal(object):
    def __init__(self, v1, v2):
        print(v1, v2)
    def __del__(self):
        pass
 
c1 = Cal(10,10)
#print(c1.add())
#print(c1.subtract())
c2 = Cal(30,20)
#print(c2.add())
#print(c2.subtract())
 
 
인스턴스 멤버와 메서드
 
멤버 함수에서도 마찬가지로 항상 self 를 더해주어야 한다.
 
그리고 self.v1, self.v2 가 자동으로 인스턴스의 멤버 변수가 된다.
 
class Cal(object):
    def __init__(self, v1, v2):
        self.v1 = v1
        self.v2 = v2
 
    def add(self):
        return self.v1+self.v2
 
    def subtract(self):
        return self.v1-self.v2
 
c1 = Cal(10,10)
print(c1.add()) # 20
print(c1.subtract()) # 0
 
 
Encapsulation
 
파이썬에서는 private 라는 것이 없다.
 
사용자 편이성에 더 중점을 둔 것이다.
 
하지만 __ 를 함수나 멤버에 붙여주면 파이썬이 Name Mangling 을 통해 다른 이름으로
 
바꿔서 마치 Private 멤버인양 사용할 수 도 있다.
 
생성자 함수인 __init__ 을 직접적으로 호출하지 못하는 이유도 여기에 있다.
 
class C( object):
    def __init__(self, v):
        self.value = v
    def show(self):
        print (self.value)
    def getValue(self):
        return self.value
    def setValue(self, v):
        self.value = v
       
c1 = C(10)
print (c1.getValue())
 
c1.setValue(20)
print (c1.getValue())
 
 
상속
 
class Class1(object):
    def method1(self): return 'm1'
c1 = Class1()
print(c1, c1.method1())
 
class Class3(Class1):
    def method2(self): return 'm2'
c3 = Class3()
print(c3, c3.method1())
print(c3, c3.method2())
 
 
클래스 객체의 확인
 
인스턴스 객체가 어떤 클ㄹ래스로부터 생성됐는지 확인하는 방법으로 
 
isinstance( 인스턴스 객체 , 클래스 객체 )
 
내장함수를 사용할 수 있다.
 
class Cal( object):
    def __init__(self, v1, v2):
        if isinstance(v1, int ):
            self.v1 = v1
        if isinstance(v2, int ):
            self.v2 = v2
    def add(self):
        return self.v1+ self.v2
    def subtract(self):
        return self.v1- self.v2
 
 
정적 메서드
 
함수 위에 @staticmethod  을 추가하면 해당 함수가 정적 메서드로 해석된다.
 
이는 클래스 객체에 할당이 되는 것이 아니고 글로벌 정적 공간에 함수가 올라가게 되므로
 
첫 인자에 객체가 필요없다.
 
class Cs:
    @classmethod
    def class_method(cls):
        print ("Class method" )
    def instance_method(self):
        print ("Instance method" )
       
i = Cs()
Cs.static_method()
i.instance_method()
 
 
클래스 메서드
 
함수 위에 @classmethod  를 추가하면 해당 함수가 클래스 메서드로 해석된다.
 
이 경우에는 클래스 객체에 생성한 메서드이며 모든 인스턴스에서 접근할 수 있는 공유 함수가 되며
 
클래스 객체 자체인 cls 를 함수의 첫 인자로 넣어주어야 한다.
 
class Cs:
    @classmethod
    def class_method(cls):
        print ("Class method" )
    def instance_method(self):
        print ("Instance method" )
       
i = Cs()
Cs.class_method()
i.instance_method()
 
 
클래스 멤버
 
클래스 멤버는 class 명 아래에 적어주면 된다.
 
이 경우에는 클래스 객체에 생성한 멤버이며
 
모든 인스턴스에서 접근할 수 있는 공유 함수가 된다.
 
함수에서 접근 할때는 <클래스이름>.<클래스변수명> 으로 접근한다.
 
class Cs:
    count = 0
    def __init__(self):
        Cs.count = Cs.count + 1
    @classmethod
    def getCount(cls):
        return Cs.count
   
i1 = Cs()
i2 = Cs()
i3 = Cs()
i4 = Cs()
print(Cs.getCount())
 
 
Override
 
함수를 재정의할 수 있다.
 
super() 를 통해 Base Class 의 함수로 접근할 수 있다.
 
class C1:
    def m(self):
        return 'parent'
   
class C2(C1):
    def m(self):
        return super().m() + ' child'
 
o = C2()
print(o.m())
 
 

'Script > Python' 카테고리의 다른 글

18. Package  (0) 2020.01.15
17. Module  (0) 2020.01.15
15.  Generic  Operation With Containers  (0) 2020.01.15
14. Documentation  (0) 2020.01.15
13. pass  (0) 2020.01.15