티스토리 뷰
[상속]
동물원을 프로그램으로 만들어 보자.
동물원에는 토끼, 사자, 호랑이, 기린등 많은 동물이 있다.
토끼를 추상화 하여 클래스로 만들고, 사자,호랑이 등등 모든 동물들을
각각 추상화하여 클래스로 만들어 봤다.
그런데 모든 동물을 추상화하여 클래스로 만들어 보니
먹고, 자고, 숨쉬는 행동들과 나이, 체중 등의 정보가 공통적으로 가지고 있다
이것들을 추상화 해보니 일반적인 동물의 특징이다.
그럼 동물이라는 클래스를 만들어 토끼, 사자, 호랑이 등에
그 특징을 모두 가지고 있으면 될 것 같다.
이것을 상속 이라고 한다.
동물이라는 클래스를 토끼, 사자, 호랑이 클래스에서 상속 받은 것이다.
class Animal:
def __init__(self):
self.weight = 1
def eat(self, food):
self.weight += food
class Tiger (Animal):
pass
동물이라는 클래스 Animal 을 정의 하였고
weight 라는 정보와 eat 이라는 함수를 정의 하였다.
여기까지는 이전까지 배운 일반적인 클래스 정의와 동일하다.
아래 Tiger 라는 클래스에 (Animal) 이라고 쓰였는데
이것은 Animal 이라는 클래스를 상속 하겠다는 의미 이다.
Tiger 아래 pass 는 아무것도 안하겠다. 즉 Tiger 클래스에는
생성자, 멤버변수, 함수 아무것도 없다.
Animal 클래스를 상속한 거 이외에 아무것도 없다.
호랑이를 한마리 인스턴스를 생성해 보겠다.
t = Tiger()
t.eat(10)
print(t.weight)
t 라는 인스턴스가 생성되었다.
eat 라는 함수는 Animal 에서 상속 받은 것이고
실제로 t.weight 를 출력 하면 11을 확인할 수 있다.
최초 1 에서 eat 함수로 10을 더해서 나온 값이다.
상속한 Animal 이 가지고 있는 부분이 정상적으로 동작하였다.
[함수 오버라이드]
오버라이드라는 무시하다, 우선시 하다 라는 뜻이다.
함수 오버라이드는 기존의 함수를 무시하고 새로 정의 한다는 의미이다.
상속을 받으면 부모클래스에서 이미 정의한 함수를 자식 클래스에서 새로 정의할 수 있다.
함수를 새로 정의할 때는 기존 내용에 추가, 기존내용을 완전 배제하고 재정의를 할 수 있다.
class Parent:
def hello(self):
print("hello parent")
class Child(Parent):
def hello(self):
Parent.hello(self)
print("hello child")
c = Child()
c.hello()
부모클래스에 hello 라는 함수를 정의 했고 자식 클래스에서 부모클래스의 hello 에다 추가하였다.
hello parent
hello child
결과는 부모클래스 hello에 정의된 내용을 출력하고 자식클래스에서 추가된 부분을 출력하였다.
이번에는 부모클래스에서 정의된 내용을 완전 배제하고 자식클래스에서 완전 재정의 해보겠다.
class Child(Parent):
def hello(self):
print("hello child")
Parent.hello(self) 은 부모클래스에서 정의된 함수를 호출하는 부분인데
이것을 호출하지 않으면 완전 재정의할 수 있다.
[생성자 오버라이드]
클래스를 상속 받으면 생성자는 어떻게 될까?
생성자도 함수기 때문에 함수 오버라이드와 동일하다
class Parent :
def __init__(self):
self.age = 0
class Child(Parent):
def __init__(self):
self.weight = 0
c = Child()
print (c.age)
부모 클래스 생성자에서 age 를 정의 했는데
자식클래스 생성자를 재 정의 하면서
자식 클래스에서는 name 이라는 변수만 정의 되었다.
따라스 c.age 로 접근하면 에러가 발생한다.
class Parent :
def __init__(self):
self.age = 0
class Child(Parent):
def __init__(self):
Parent.__init__(self)
self.weight = 0
이렇게 자식클래스 생성자에서 에서 부모 클래스의 생성자를 호출하면
부모클래스에서 정의된 age 를 자식클래스에서 사용할 수 있다.
[static var, static method]
중력의 영향을 받는 물체들을 추상화해 보았다.
이때는 생성된 모든 물체들은 동일한 중력에 영향을 받는다.
그렇기 때문에 모든 인스턴스 마다 중력의 값을 따로 저장할 필요 없고
하나의 변수에만 접근해서 사용하면 된다.
이것은 클래스 정적변수라고 한다.
class Material:
gravity = 9.8
@staticmethod
def set_gravity(gravity):
Material.gravity = gravity
m1 = Material()
Material.set_gravity(10)
print(Material.gravity)
gravity 는 클래스 정적변수로 인스턴스가 몇개이던 하나만 있다.
또한 이런 정적변수를 변경할때는 정적 함수를 호출해서 변경하거나 값을 얻을 수 있다.
인스턴스에 종속적이지 않은 값 혹은 기능들을 정적변수 혹은 정적함수를 구현한다.
set_gravity 인스턴스가 생성되지 않아도 동작한다.
마찬가지로 gravity 도 인스턴스가 생성되지 않아도 접근할 수 있다.
[과제]
- 동물, 육식동물, 호랑이, 사자를 각각 클래스를 구현해 보자.
- 동물클래스를 상속 받아 육식동물은 사냥함수를 구현해 보자
- 육식동물을 상속 받아서 호랑이, 사자를 구현해 보자
- 육식동물의 사냥 함수를 호랑이,사자에서 오버라이드 해보자
- 정적변수, 정적함수를 위 클래스들에 적용해 보자.
'python lecture > basic' 카테고리의 다른 글
[edu] 파이썬 시작하기 - 10 (decorator) (0) | 2018.09.21 |
---|---|
[edu] 파이썬 시작하기 - 8 (0) | 2018.08.29 |
[edu] 파이썬 시작하기 - 5 (0) | 2018.08.27 |
[edu] 파이썬 시작하기 - 4 (0) | 2018.08.27 |
[edu] 파이썬 시작하기 - 3 (for, 반복문) (0) | 2018.08.26 |
- Total
- Today
- Yesterday
- 파이썬 프로그래밍
- gitignore
- 장고
- django chatbot
- 면접답변
- 파이썬 입문
- 파이썬
- 플러스친구 자동응답
- virtualenv
- GIT
- 장고 카톡 자동응답
- 엑셀 비교
- wsgi
- 문서 비교
- 파이썬 독학
- 이미지 비교
- 면접정답
- Python
- admin.py
- 모바일 스킨 적용
- chatbot
- 모바일 테마 적용
- 문과 코딩
- Tistory
- 장고 플러스친구 자동응답
- django
- 파이썬 강좌
- gitlab
- pycrypto
- PuTTYGen
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |