728x90
01. 상속(Ingeritance)
- 부모 클래스의 메소드와 변수등이 자식 클래스로 자동으로 전달된다.
- 클래스들이 공통적으로 사용하는 기능을 부모 클래스에 저장 한 후
- 클래스들이 공통적으로 사용하는 기능을 부모 클래스에 저장 한 후
상속받아 사용하면 개발 속도를 향상 시킬 수 있다.
- 소스 재사용으로 인한 개발자의 개발 부담이 감소된다.
- Python은 C++ 처럼 다중 상속을 지원한다.
- 개발시에 상속을 권장하지 않는데 그 이유는 2개 이상의 클래스가
- Python은 C++ 처럼 다중 상속을 지원한다.
- 개발시에 상속을 권장하지 않는데 그 이유는 2개 이상의 클래스가
서로 결합되어 객체지향이라는 독립성을 위배하기 때문에 사용을 추천하지 않습니다.
예) 부모 클래스와 자식 클래스가 서로 관련되어 자식 클래스가 독립적으로
기능을 실행할 수 없습니다. 소스 변경시 예상하지 못한 다른곳에서 에러 발생
- 형식: class 자식 클래스(부모 클래스): class 자식 클래스(부모 클래스 1, 부모 클래스 2):
1. 새로운 기능이 추가되며 부모 기능을 상속하는 경우
[실행 화면]
기능을 실행할 수 없습니다. 소스 변경시 예상하지 못한 다른곳에서 에러 발생
- 형식: class 자식 클래스(부모 클래스): class 자식 클래스(부모 클래스 1, 부모 클래스 2):
1. 새로운 기능이 추가되며 부모 기능을 상속하는 경우
[실행 화면]
모토롤라
전화 기능
문자 기능
------------------
Sumgsung
전화 기능
문자 기능
멀티미디어 메시지
------------------
Android
전화 기능
문자 기능
멀티미디어 메시지
인터넷
▷ /oop1/Class6.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
# class Phone: # 모든 클래스는 object class를 상속받음, 생략 가능
class Phone(object):
phone_name = "모토롤라"
def tel(self):
print('전화 기능')
def sms(self):
print('문자 기능')
class PDA(Phone):
pda_name = "Samsung"
def mms(self):
print("멀티미디어 메시지")
class Smart(PDA):
smart_name = "Android"
def internet(self):
print("인터넷")
if __name__ == '__main__':
phone = Phone()
print(phone.phone_name)
phone.tel()
phone.sms()
print("---------------")
pda = PDA()
print(pda.pda_name)
pda.tel()
pda.sms()
pda.mms()
print("---------------")
smart = Smart()
smart.tel()
smart.sms()
smart.mms()
smart.internet()
print("---------------")
-------------------------------------------------------------------------------------
2. 공통 기능을 공유하며 다양한 유형으로 기능이 분류되는 경우
[실행 화면]
---------------------
주문 내역
---------------------
메뉴: 짜장면
가격: 5,000 원
수량: 2
합계: 10,000 원
---------------------
현금 결재를 합니다.
---------------------
주문 내역
---------------------
메뉴: 김밥
가격: 2,500 원
수량: 3
합계: 7,500 원
---------------------
카드 결재를 합니다.
---------------------
주문 내역
---------------------
메뉴: 아메리카노
가격: 2,000 원
수량: 1
합계: 2,000 원
---------------------
포인트 결재를 합니다.
▷ /oop1/Class7.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
import locale
class Payment(object):
def order(self, menu, price, count):
self.menu = menu
self.price = price
self.count = count
def calc(self):
# locale.setlocale(locale.LC_ALL, '') # 시스템 지역 사용
# locale.format('%d', 1000, True)
# locale.format('%.1f', 1000, True)
self.total = self.price * self.count
print()
print('---------------------')
print(' 주문 내역 ')
print('---------------------')
print('메뉴: ' + self.menu)
print('가격: ' + format(self.price, ',') + ' 원')
print('수량: ' + str(self.count))
print('합계: ' + format(self.total, ',') + ' 원')
print('---------------------')
class Cash(Payment):
def cash(self):
print(' 현금 결재를 합니다.')
class Card(Payment):
def card(self):
print('카드 결재를 합니다.')
class Tel(Payment):
def tel(self):
print('전화 결재를 합니다.')
class Point(Payment):
def point(self):
print('포인트 결재를 합니다.')
if __name__ == '__main__':
cash = Cash()
cash.order("짜장면", 5000, 2)
cash.calc()
cash.cash()
card = Card()
card.order("김밥", 2500, 3)
card.calc()
card.card()
point = Point()
point.order("아메리카노", 2000, 1)
point.calc()
point.point()
-------------------------------------------------------------------------------------
* 객체지향 분석 설계 분야에서 상속은 콤포넌트의 분리를 방해함으로
사용을 권장하지 않습니다. 부모 자식간에 강한 결합이 발생하여 어떤 쪽에서
변화가 발생하면 다른쪽도 심하게 영향을 받음(나비 효과 발생).
3. 부모클래스의 생성자 호출
[실행 화면]
PDA 객체 생성
Smart 객체 생성
LTE
Android
전화 기능
문자 기능
음악 Play
▷ /oop1/Class8.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
class PDA:
def __init__(self, os): # 생성자
self.os = os
print('PDA 객체 생성')
def tel(self):
print("전화 기능")
def sms(self):
print("문자 기능")
class Smart(PDA):
def __init__(self, comm, os):
self.comm = comm
# 부모 클래스의 생성자 호출, 호출 순서 상관 없음.
PDA.__init__(self, os)
print('Smart 객체 생성')
def bluetooth(self):
print("음악 Play")
smart = Smart("LTE", "Android") # comm, os
print(smart.comm) # LTE
print(smart.os) # Android
smart.tel()
smart.sms()
smart.bluetooth()
-------------------------------------------------------------------------------------
4. 생성자/메소드 오버로딩
- Python은 메소드 오버로딩은 지원하지 않으나, 메소드로 전달되는 인수의 갯수를 조절하여 기능을 구현 할 수 있다.
[실행 화면]
Smart 객체 생성
brand:
price: 0
음악 Play
----------------------------------------
Smart 객체 생성
brand: Android
price: 0
음악 Play
----------------------------------------
Smart 객체 생성
brand: Android
price: 400000
음악 Play
----------------------------------------
▷ Class9.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
class Smart():
def __init__(self, brand='', price=0):
print('Smart 객체 생성');
self.brand = brand;
self.price = price;
print("brand: " + self.brand)
print("price: " + str(self.price))
def bluetooth(self):
print("음악 Play")
print('----------------------------------------')
smart = Smart() # 생성자에 아무런 값도 할당하지 않은 경우
smart.bluetooth()
smart = Smart("Android") # 생성자에 하나의 값을 할당
smart.bluetooth()
smart = Smart("Android", 400000) # 생성자에 2개의 값을 할당
smart.bluetooth()
# ERROR, 인수가 너무 많음
# smart = Smart("Android", 400000, "LTE") # 생성자에 3개 이상의 값을 할당
# smart.bluetooth()
-------------------------------------------------------------------------------------
5. 다중 상속
- 속성 상속은 권장하지 않음
[실행 화면]
Smart 객체 생성
name: 모토롤라
전화 기능
문자 기능
멀티미디어 메시지
▷ Class10.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
class Phone:
name = '모토롤라'
def __init__(self): # 생성자
self.env = "Android" # 상속 안됨
def tel(self):
print("전화 기능")
def sms(self):
print("문자 기능")
class PDA:
def __init__(self, brand): # 생성자
self.brand = brand # 상속 안됨
print('PDA 객체 생성')
def mms(self):
print("멀티미디어 메시지")
class Smart(Phone, PDA):
def __init__(self):
print('Smart 객체 생성')
smart = Smart()
print('name: ' + smart.name)
# print(smart.env) # 상속 안됨
# print(smart.brand) # 상속 안됨
smart.tel()
smart.sms()
smart.mms()
-------------------------------------------------------------------------------------
728x90
'빅데이터 프로그래밍 > Python' 카테고리의 다른 글
[Python] 13. [IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록, 파일 복사 (0) | 2017.08.02 |
---|---|
[Python] 12. 예외처리(Excetption), try, except ~ else ~ finally 실습 (0) | 2017.08.02 |
[Python] 10. Class 선언, 클래스 멤버, 메소드, 인스턴스 멤버, 메소드의 실습, 생성자, 소멸자, 모듈 분리 (0) | 2017.08.02 |
[Python] 09. 모듈과 패키지의 사용, import의 사용, Template (0) | 2017.08.02 |
[Python] 08. 함수 다루기, 함수의 인자, 지역 변수와 전역 변수, 리턴값, 디버깅 (0) | 2017.08.02 |
댓글