728x90
반응형
객체를 쉽고 편리하게 생성하기 위해 만들어진 구문
구조
class 클래스명 :
인스턴스
클래스를 기반으로 생성한 객체
생성자
인스턴스를 생성할 때 호출되는 함수
소멸자
인스턴스가 삭제될 때 호출되는 함수
class Test :
def __init__(self) :
print( '생성되었습니다.' )
def __del__(self):
print( '소멸되었습니다.' )
test = Test() # 생성되었습니다. 출력
# test는 Test클래스의 인스턴스가 되었다.
print( type(test) ) # <class '__main__.Test'>
# 이제 더이상 test가 쓰이지 않고 프로그램이 종료되므로
# 소멸되었습니다. 출력
멤버(변수)와 메소드(함수)
class Student:
def __init__(self, name, kor, eng, math):
self.name = name
self.kor = kor
self.eng = eng
self.math = math
def get_sum(self):
return self.kor + self.eng + self.math
def get_avg(self):
return self.get_sum() / 3
def to_string(self):
return "{}\t{}\t{:3.2f}".format(self.name, self.get_sum(), self.get_avg())
students = [ Student('홍길동', 80, 90 ,100), Student('김철수', 88, 95 ,99), Student('개나리', 77, 77 ,99), ]
print("이름",'총점','평균',sep='\t')
for student in students:
print(student.to_string())
# 실행결과
# 이름 총점 평균
# 홍길동 270 90.00
# 김철수 282 94.00
# 개나리 253 84.33
클래스 변수와 함수
class Student :
# 클래스 변수
count = 0
students = []
# 클래스 함수
@classmethod
def print(cls) :
print("{:-^20}".format("학생목록") )
print("이름\t총점\t평균")
for student in cls.studendts :
print( student.to_string() )
print( '-'*25 )
# 인스턴스 함수
def __init__(self, name, kor, eng, math):
self.name = name
self.kor = kor
self.eng = eng
self.math = math
# 클래스 변수 설정
Student.count += 1
Student.students.append(self)
def get_sum(self):
return self.kor + self.eng + self.math
def get_avg(self):
return self.get_sum() / 3
def to_string(self):
return "{}\t{}\t{:3.2f}".format(self.name, self.get_sum(), self.get_avg())
Student('홍길동', 80, 90 ,100)
Student('김철수', 88, 95 ,99)
Student('개나리', 77, 77 ,99)
print( Student.count ) # 3
Student.print()
#실행결과
#--------학생 목록---------
#이름 총점 평균
#홍길동 270 90.00
#김철수 282 94.00
#개나리 253 84.33
#----------------------------
상속
기본적으로 어떤 클래스 틀을 받아들이는 것을 상속이라 한다.
인스턴스 또한 클래스를 상속받아서 만들어졌다고 할 수 있다.
클래스가 클래스를 상속받을 수 있는데 이때 상속받는 클래스를 자식클래스라하고 상속하는 클래스를 부모클래스라고 한다.
오버라이드 (오버라이딩)
부모 클래스의 메소드와 같은 이름으로 메소드를 정의하면 부모 클래스의 메소드가 아닌 재정된(오버라이딩) 메소드가 호출된다.
활용
class Human :
def __init__(self):
self.value = "사람입니다."
def thinking(self):
print( '생각 중' )
class Student(Human) :
def __init__(self):
Human.__init__(self)
def func(self) :
print("공부 중")
class Teacher(Studenf) :
def __init__(self):
Student.__init__(self)
#오버라이딩
def func(self) :
print("지도 중")
student = Student()
student.thinking() # 생각 중
print(student.value) # 사람입니다.
people = [Student(), Student(), Teacher(), Student()]
for person in people :
if isinstance(person, Student) :
person.func()
#실행결과
# 공부 중
# 공부 중
# 지도 중
# 공부 중
# isinstance(인스턴스i, 클래스a) -> 인스턴스i가 클래스a를 상속받았으면 True
for person in people :
if isinstance(person, Student) :
person.func()
# 실행결과
# 공부 중
# 공부 중
# 공부 중
for person in people :
if isinstance(person, Human) : # 부모 클래스로도 상속 확인 가능
person.thinking()
# 생각 중
# 생각 중
# 생각 중
# 생각 중
print(type(student) == Student) # True
print(type(student) == Human) # False
# 클래스명.mro()
print( Student.mro() ) # [<class '__main__.Student'>, <class '__main__.Human'>, <class 'object'>]
다중 상속
여러 클래스로부터 상속받을 수 있습니다.
class Human :
def __init__(self):
self.value = "사람입니다."
def thinking(self):
print( '생각 중' )
class Person :
def __init__(self):
self.spec = "특별합니다."
def func(self) :
print("일하는 중")
class Teacher(Human, Person) :
def __init__(self):
Human.__init__(self)
Person.__init__(self)
#오버라이딩
def func(self) :
print("지도 중")
Teacher = Student()
Teacher.thinking() # 생각 중
print(Teacher.spec) # 특별합니다.
# 클래스명.mro()
print( Teacher.mro() ) # [<class '__main__.Teacher'>, <class '__main__.Person'>, <class '__main__.Human'>, <class 'object'>]
728x90
반응형
'Python 파이썬 > 기초 & 내장모듈' 카테고리의 다른 글
소프트웨어 인스펙션 체크 리스트 (0) | 2022.06.09 |
---|---|
functools ) partial() 인수가 이미 채워진 새로운 함수 만들기 (0) | 2022.05.12 |
python ) 모듈과 패키지 (0) | 2022.03.11 |
python ) 예외 오류 처리 try (0) | 2022.03.11 |
python ) 함수 function (0) | 2022.03.08 |
댓글