바인딩
: 실제 호출될 함수를 연결하는 것
정적바인딩 : 호출할 함수를 변수의 타입으로 결정하는 것
동적바인딩 : 호출할 함수를 인스턴스 공간의 타입으로 결정하는 것
다형성
: 다양한 형태나 성질
하나의 객체를 여러개의 클래스로 표현하는것을 말한다
상속이 기본
클래스를 기능별로 분리하여 통합적인 처리를 하기위해서 사용된다
업캐스팅을 바탕으로 이루어진다
부모의 참조형변수 안에 자식클래스의 인스턴스 공간의 정보가 저장되는 형태
class Animal:
def __init__(self,name) -> None:
self.name = name
def bark(self):
print("????????")
def disp(self):
print("이름 : {}".format(self.name))
class Cat(Animal):
def __init__(self, name) -> None:
super().__init__(name)
def bark(self):
print("야옹")
def eat(self):
print("캣닙")
class Dog(Animal):
def __init__(self, name) -> None:
super().__init__(name)
def bark(self):
print("멍멍")
def eat(self):
print("개껌")
import random
a = None
su = random.randint(0,1)
if su == 0:
a = Dog("개")
elif su == 1:
a = Cat("고양이")
a.disp()
a.bark()
a.eat()
: 부모클래스의 고유한 기능
오버라이드메소드는 자식클래스 우선
다른 프로그래밍언어에서는 원래 사용불가
출력화면
추상클래스
: 부모의 역할을 수행하기위한 클래스
자식클래스에서 구현했으면 하는 메소드의 틀을 만들어놓은 클래스
추상 메소드를 하나라도 포함하고 있으면 추상 클래스가 된다
객체 생성 불가
파이썬같은 경우 기본문법으로 제공하지 않는다
모듈을 추가해주어야 한다 ; abc
from abc import *
class Animal(metaclass = ABCMeta):
def __init__(self,name) -> None:
self.name = name
# 추상메소드 : 메소드의 틀, 껍데기 메소드
# 반드시 자식클래스에서 오버라이드를 해주어야 한다
@abstractmethod
def bark(self):
pass
def disp(self):
print("이름 : {}".format(self.name))
class Cat(Animal):
def __init__(self, name) -> None:
super().__init__(name)
def bark(self):
print("야옹")
def eat(self):
print("생선")
class Dog(Animal):
def __init__(self, name) -> None:
super().__init__(name)
def bark(self):
print("멍멍")
def eat(self):
print("뼈다귀")
a = Cat("이름")
a.bark()
a.eat()
b = Dog("개")
b.bark()
b.eat()
출력화면
다중상속
: 권장하지 않는 문법
애매한 문법 ; 어느클래스의 메소드인지를 모른다
메소드의 경우 겹칠 때는 오버라이드를 해서 자식클래스에 둔다
class A:
def __init__(self) -> None:
print("A")
def disp(self):
print("A")
class B(A):
def __init__(self) -> None:
super().__init__()
print("B")
def disp(self):
print("B")
class C(A):
def __init__(self) -> None:
super().__init__()
print("C")
def disp(self):
print("C")
class D(B,C):
def __init__(self) -> None:
super().__init__()
print("D")
print(D.__mro__)
D().disp()
출력화면
Exercise
저희 학원은 자바, C언어만 강의를 하고 있었습니다.
운영이 너무 잘 되서 파이썬 과목을 추가하기로 결정하였고
관리 프로그램 클래스도 개량하여 사용하기로 하였습니다.
(StudentEx 클래스)
(추가된 항목) 파이썬(python) 파이썬 과목 점수
(합계, 평균 등이 제대로 나오도록 아래의 객체를 생성 후 정보 출력)
name java c python
[1] 엑스맨 80 85 90
[2] 배트맨 90 85 80
[3] 슈퍼맨 100 20 25
class Student:
def __init__(self, name, java, c) -> None:
self.__name = name
self.__java = java
self.__c = c
def set_name(self, name):
self.__name = name
def set_tel(self, java:int):
self.__java = java
def set_c(self, c:int):
self.__c = c
def get_name(self):
return self.__name
def get_java(self):
return self.__java
def get_c(self):
return self.__c
def disp(self):
print("이름 : {}".format(self.__name))
print("Java 점수 : {}".format(self.__java))
print("C 점수 : {}".format(self.__c))
def __str__(self) -> str:
return "{}\t{} 점\t{} 점".format(self.__name,self.__java,self.__c)
@classmethod
def studentList(cls,ls:list):
print("\tname\tjava\tc")
if ls.__len__()==0:
print("데이터가 없습니다.")
else:
for i in range(ls.__len__()):
print("[{}]\t{}".format(i+1,ls[i]))
a1 = Student("신모씨",80,70)
a2 = Student("김모씨",50,60)
a3 = Student("장모씨",100,100)
a1.disp()
a2.disp()
a3.disp()
Student.studentList([a1,a2,a3])
print("======================================")
class StudentEx(Student):
def __init__(self, name, java, c, python) -> None:
super().__init__(name, java, c)
self.__python = python
def set_python(self, python:int):
self.__python = python
def get_python(self):
return self.__python
def sum(self):
return self.get_java() + self.get_c() + self.get_python()
def avg(self):
return self.sum()/3
def disp(self):
super().disp()
print("Python 점수 : {}".format(self.__python))
print("총점 : {}".format(self.sum()))
print("평균 : {:.2f}".format(self.avg()))
def __str__(self) -> str:
return "{}\t{} 점\t{} 점\t{} 점\t{} 점\t{:.2f} 점".format(self.get_name(),self.get_java(),self.get_c(),self.__python,self.sum(),self.avg())
@classmethod
def studentList(cls,ls:list):
print("\tname\tjava\tc\tpython\t합계\t평균")
if ls.__len__()==0:
print("데이터가 없습니다.")
else:
for i in range(ls.__len__()):
print("[{}]\t{}".format(i+1,ls[i]))
b1 = StudentEx("장땡땡",80,50,70)
b2 = StudentEx("김땡땡",80,90,50)
b1.disp()
b2.disp()
a1 = StudentEx(a1.get_name(), a1.get_java(), a1.get_c(), 90)
StudentEx.studentList([a1,a2,a3,b1,b2])
출력화면
'Backend > Python' 카테고리의 다른 글
Python 파이썬 예외 처리 모듈 traceback (0) | 2023.07.06 |
---|---|
Python 파이썬 예외 처리 try except (0) | 2023.07.06 |
Python 파이썬 상속 기본 개념 (0) | 2023.07.05 |
Python 파이썬 생성자, 클래스 예제 03 (0) | 2023.07.04 |
Python 파이썬 생성자, 클래스 예제 02 (0) | 2023.07.04 |