isinstance() 함수
- 상속 관계에 따라서 객체(인스턴스)가 어떤 클래스를 기반으로 만들었는지 확인 할 수 있게 해주는 함수
isinstance(인스턴스, 클래스)
- 인스턴스가 해당 클래스 기반으로 만들어졌다면 True, 아니면 False를 반환
- 리스트 내부에 여러 종류의 인스턴스가 있을 때, 인스턴스를 구분하여 속성과 기능을 사용하는 등의 기능을 구현할 때 활용
isinstance() 함수의 다양한 활용
- 리스트 내부에 여러 종류의 인스턴스가 들어있을 때, 인스턴스들을 구분하며 속성과 기능 사용
class Student:
def study(self):
print("공부를 합니다.")
class Teacher:
def teach(self):
print("학생을 가르칩니다.")
classroom = [Student(), Student(), Teacher(), Student(), Student()]
for person in classroom:
if isinstance(person, Student):
person.study()
elif isinstance(person, Teacher):
person.teach()
공부를 합니다.
공부를 합니다.
학생을 가르칩니다.
공부를 합니다.
공부를 합니다.
단순한 인스턴스 확인
type(인스턴스) == 클래스
- 속성 -> 변수
- 기능 -> 메소드
- isinstance() 함수는 클래스 상속 관계까지 확인하는 반면, type() 함수는 단순 관계만 확인
class Human:
def __init__(self):
pass
class Student(Human):
def __init__(self):
pass
student = Student()
print("isinstance(student, Human):", isinstance(student, Human))
print("type(student) == Human:", type(student) == Human)
isinstance(student, Human): True
type(student) == Human: False
특수한 이름의 메소드
- 다양한 보조 기능들
__<이름>__()
형태
- 특수한 상황에 자동으로 호출되도록 만들어짐
- ex.
__str__()
함수
class Student:
def __init__(slef, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
def get_sum(self):
return self.korean + self.math +\
self.english + self.science
def get_average(self):
return self.get_sum() / 4
def __str__(self):
return "{}\t{}\t{}".format(
self.name,
self.get_sum(),
self.get_average())
students = [
Student("윤인성", 87, 98, 88, 95),
Student("연하진", 92, 98, 96, 98),
Student("구지연", 76, 96, 94, 90),
Student("나선주", 98, 92, 96, 92),
Student("윤명월", 64, 88, 92, 92)
]
print("이름", "총점", "평균", sep="\t"
for student in students:
print(str(student))
- 이와 같이
__str__()
함수로 정의하면 str() 함수를 호출할 때 __str__()
함수가 자동으로 호출됨
- eq
- 같다
- a == b
- a : 인스턴스, self
- b : 비교 대상자 (새로운 객체를 받음)
- a가 b와 같다
- gt
- a가 b보다 크다
TypeError 발생시키기
class Student:
def __eq__(self, value):
if not isinstance(value, Student):
rais TypeError("Student 클래스의 인스턴스만 비교할 수 있습니다")
return self.get_sum() == value.get_sum()
student_a = Student("윤인성", 87, 98, 88, 95)
student_a == 10
10
Trackback (most recent call last):
.
.
.
TypeError : Student 클래스의 인스턴스만 비교할 수 있습니다
클래스 변수와 클래스 함수
- 인스턴스가 속성(변수)와 기능(메소드)를 가지는 것과 같이 클래스도 속성(변수)와 기능(함수)를 가질 수 있음
클래스 변수
- class 구문 바로 아래의 단계에 변수를 선언
class 클래스이름:
클래스변수이름 = 값
클래스이름.변수이름
클래스 함수
- 클래스가 가진 함수(클래스)
- 클래스가 가진 기능을 명시적으로 표현
- 클래스 데코레이더
@classmethod
를 사용하여 선언
- 클래스 함수 만들기
class 클래스이름:
@classmethod
def 함수이름(cls, 매개변수):
코드
- 매개변수 cls(클래스라 읽음)는 클래스 자체를 의미 (관례적 사용)
클래스이름.함수이름(인자)
가비지 컬렉터 (garbage collector)
- 메모리에서 더 사용할 가능성이 없는 데이터를 제거하는 역할 (가비지 컬렉션)
- ex. 변수에 저장하지 않은 객체, 함수가 실행되고 나오면서 변수를 활용할 수 없게 된 경우
- 프로그램에서 변수를 만들면 데이터 메모리에 적재되고, 메모리가 부족해지면 스왑(swap) 처리를 통해 임시로 하드디스크에 데이터를 적재하여 작업을 진행 (속도가 느려짐)
- 소멸자 (destructor)
- 생성자와 반대로 인스턴스가 소멸될 때 호출되는 함수
- 클래스 내부에
__del__(self)
함수로 선언
- 8~10행에서 Test 클래스의 인스턴스를 생성했지만, 이를 변수에 저장하지 않으면 가비지 컬렉터가 이후에 사용하지 않은 것으로 이해하고 메모리에서 삭제
- 8~9행에서 생성한 Test 인스턴스를 변수에 저장함으로써 나중에 사용할 수 있다고 명시적으로 작성하며, 프로그램이 종료될 때까지 데이터를 메모리에 적재함
- 프로그램 종료 후 삭제
프라이빗 변수
- 변수를 마음대로 사용하는 것을 방지
- 클래스 내부의 변수를 외부에서 사용하는 것을 막고 싶을 때 사용하는 변수
- 속성을 선언할 때 앞에 __
을 붙여 외부에서 사용할 수 없는 변수로 지정
- 프라이빗 변수 선언
- __<변수이름>
- 위와 같은 형태로 인스턴스 변수 이름 선언
게터(getter)와 세터(setter)
- 프라이빗 변수 값을 추출하거나 변경할 목적으로 간접적으로 속성에 접근하도록 하는 함수(메소드)
게터 (getter)
세터 (setter)
데코레이터를 사용한 게터와 세터
- 변수 이름과 같은 함수(메소드)를 정의하고, 함수 위에 해당 데코레이터를 추가
- 파이썬 프로그래밍 언어에서 제공하는 게터와 세터를 만들고 사용하는 기능
- 변수 이름과 같은 함수를 정의하고 위에
@property
와 @<변수이름>.setter
데코레이터 붙이기
- 게터 구현하기
@propety
def 함수이름(self):
return self.<프라이빗변수이름>
@<변수이름>.setter
def 함수이름(self, value):
코드
상속
- 프로그래밍 언어에서 기반이 되는 것을 부모, 이를 기반으로 생성한 것을 자식이라 부름
- 부모가 자신의 기반을 물려주는 기능이므로 상속
상속 (inheritance)
- 어떤 클래스를 기반으로 그 속성과 기능을 물려받아 새로운 클래스를 만드는 것
- 다른 누군가가 만든 기본 형태에 내가 원하는 것만 추가하거나 교체
- '표준 컴퓨터' 클래스
- '표준 컴퓨터 클래스' 기반으로 RAM만 변경한 컴퓨터 클래스
- '표준 컴퓨터 클래스' 기반으로 SSD만 추가한 컴퓨터 클래스
- 부모 클래스 : 상속의 기반이 되는 클래스
- 자식 클래스 : 부모 클래스를 상속하여 만든 새로운 클래스
다중 상속
- 여러 클래스의 속성과 기능을 동시에 물려받아 새로운 클래스를 만드는 것
- 다른 누군가가 만든 형태들을 조립하여 내가 원하는 것을 만드는 것
함수 재정의 (override)
- 부모 클래스의 정의된 메소드를 자식 클래스에서 다시 정의하는 것