본문 바로가기
Python 파이썬/기초 & 내장모듈

python ) 클래스 class

by 하이방가루 2022. 3. 11.
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
반응형

댓글