파이썬에서의 클래스
- 파이썬에서 클래스를 정의하면 클래스 객체가 이름공간에 생성이 되고 모든 인스턴스들이 이를 참조하게 된다.
- 그렇기 때문에 인스턴스 객체에 개인적인 멤버를 추가할 수 있다.
- 인스턴스 객체를 만든후 인스턴스 객체가 변경되기 전까지는 클래스 객체와 동일한 데이터와 메서드를 가리킨다.
- 클래스 멤버함수 클래스 멤버 변수는 클래스 객체의 공간에 형성이 되고 모든 객체에서
클래스명.클래스 멤버변수
클래스명.클래스 멤버함수
형태로 접근할 수 있다.
클래스 선언
- 최상위 클래스는 파이썬 모든 타입의 루트인 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 |