파이썬 클래스
클래스... 대부분의 언어를 하면서 객체 지향 언어와 함께 들어보고 사용해 봤을 것이다.
파이썬은 모든 것이 객체이며 클래스 역시 파이썬에서는 하나의 객체이다.
다음의 코드를 통해 클래스란 타입을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
|
'''
파이썬은 모든것이 객체이다, 클래스 역시 파이썬에서 하나의 객체이다.
str이라는 클래스는 type 클래스의 객체이다.
클래스에서 생성된 객체를 인스턴스라 한다.
'''
s = 'hello world'
print(type(s))
print(type(str))
print(s.__class__) # 어떤 클래스(타입)에 의해 생성되었는지 담고 있는 지역변수 : __class__
print(s.replace('hel','yol'))
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
위와 같은 타입 결과를 얻을 수 있다. 부가 설명은 주석으로 처리하였다.
클래스 정의 및 재정의, 클래스변수, 은닉과 이름장식
C++ 과 비슷하다고 생각하면 된다. 변수명에 클래스의 이름으로 인스턴스를 생성하고 속성값고 메서드를 호출한다. 클래스를 정의하는 방법은 코드를 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
class book:
name = str()
var2 = '클래스변수'
__var = '한국' # 클래스 변수, __하면 기존 변수명으로 확인 불가 : 접근제한
def __init__(self,name): #초기화 함수 재정의
self.name = name
def read(self): #self는 첫번째 매개변수 선언해야 함
def gettt(self):
return self.__var
def settt(self,var):
self.__var = var #접근제한의 값을 변경하고 반환한함
r = book('delvert') #인스턴스 생성, 인자값(name때문)을 넣고 인스턴스 생성하기
r.name = '철수'
r.read() #메서드 호툴
# 클래스 생성 : C++과 유사함
print(r.var2) # 클래스 변수 값 확인
#클래스에 의해 생성된 모든 객체에서 같은 값을 조회할 때 사용가능
#name은 __init() 함수내에서 사용, 객체가 인스턴스화 될 때마다 새로운 값이 할당되며 서로다른 객체간 값을 공유 못함
ia = book('한쿡')
print(ia.gettt())
ia.settt('Tistory')
print(ia.gettt())
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
주의할점만 보자,
클래스의 맴버함수에는 항상 'self'가 있어야한다. 이 self를 통해 속성을 호출해야한다.
__init__() 는 초기화 함수 재정의이다. 이것을 사용하면 인스턴스 생성시 반드시 이름을 인자값으로 넣어야한다. 두 번째 인자인 name은 객체 인스턴스 생성시에 인자 값을 위한 매개변수이다.
클래스변수는 클래스안에서 정의한 변수이다. 보통 클래스에 의해 생성된 모든 객체에서 같은 값을 조회할 때 사용한다. 이와 함께 인스턴스 변수와 차이가 있으나 여기서 깊게 다루지는 않겠다. 주석을 참고하자.
클래스에서 정보 은닉은 파이썬에서 이름 장식으로 표현한다. 클래스변수에 '__변수명' 로 클래스를 정의할 때 사용하던 변수명으로는 접근할 수 없다. 그래서 gettt(), settt() 메서드를 통해 값을 변경하고 반환할 수 있다.
코드의 결과는 아래와 같다.
클래스 상속
클래스하면 상속과 다형성을 뺴놓을 수 없다. C++에서는 이를 위해 가상함수의 개념이 필요하지만 파이썬에서는 어떤 것이 필요한지 알아보자.
우선 상속은 중복 코드를 최소화 함과 클래스간의 계층 관계 파악이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class parent:
nation = '나라'
def __init__(self,name):
self.name = name
def chk(self):
class child1(parent): #부모의 자식 클래스를 선언
#nation = '한쿡' # 클래스 변수
#def __init__(self,name): #초기화 삼수 재정의
def f(self):
class child2(parent): #부모의 자식 클래스를 선언
#nation = '영국'
#def __init__(self,name):
def f2(self):
m = child1('한국') # child1 인스턴스 생성(부모 init 활용)
print(m.nation)
print(m.f())
m2 = child2('영국은 ') #child2 인스턴스 생성
print(m2.nation)
print(m2.f2())
print(m.chk())
print(m2.chk())
|
크게 어려운 내용은 없다. 마지막에서 자식 클래스의 인스턴스로 부모 클래스의 변수와 맴버함수를 확인한다면 크게 이해하는데 어렵지는 않을 것이다. 즉, print(m.nation)을 실행하면 알 것이다.
__class__ 로 타입 확인 가능!! __base__로 부모 클래스 확인 가능하다.
부모클래스가 2개이면 (부모 클래스이름, 부모클래스이름2) 로 적용가능하다.
상속을 하는 방법은 위의 코드와 같이 class '자식클래스이름'(부모클래스) 의 형태이다.
실행결과는 아래와 같다.
클래스 다형성
다형성은 부모 클래스와 동일한 이름의 메소드를 그대로 자식 클래스에서 구현하여 재정의하는 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#다형성
class dev:
def __init__(self, name):
self.name = name
def coding(self):
class python(dev):
def coding(self):
class cpp(dev):
def coding(self):
class js(dev):
def coding(self):
super().coding()
pb = python('a는')
cb = cpp('b는')
jb = js('c는')
#부모 클래스와 동일한 이름의 메서드를 그대로 자식 클래스에서 구현하여 재정의 하는것을 다형성이라 한다.
#super() 를 통해 부모 인스턴스를 확보하여 부모의 메서드를 호출할 수 있다.
|
코드를 보면 맴버함수 coding이 모두 이름이 같다. 위 코드의 결고가 어떤지는 금방 알 수 있을 것이다.
'python' 카테고리의 다른 글
[python] 파이썬 클래스 실습 및 정규식예제 (0) | 2019.08.26 |
---|---|
[python] 파이썬 모듈_Module (0) | 2019.08.26 |
[python] 파이썬 함수, Type(리스트, 튜플, dictionary) (0) | 2019.08.13 |
[python] 파이썬 제어문 (0) | 2019.08.12 |
[python] 자료형, 입력, 출력 (0) | 2019.08.12 |