24주차.클래스의 추가적인 구문

09Roalwlzm01·2023년 11월 30일
0

Python

목록 보기
33/36
post-custom-banner

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() 함수를 사용
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))	# Human 안에 student가 있는가?
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
#
	# __str__()이라는 이름으로 함수를 선언
	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() 함수의 매개변수로 넣으면 student의 __str__() 함수가 호출됨

  • 이와 같이 __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)

  • 부모 클래스의 정의된 메소드를 자식 클래스에서 다시 정의하는 것


post-custom-banner

0개의 댓글