cs

책의 끝이 보인다 보여...

 

이제... 드디어 혼공파 마지막!!!

 

파이썬 진짜 쌩 기초아무것도 몰랐지만 이제 basic정도 된것같다.  

 

생각보다 블로그 하는 시간이 일정하지 않다보니까 좀 늦은 감이 있는데 그래도 뿌듯!! 

 

자 깔끔하게 마무리 하고 다른 책(머신러닝+분석)으로 넘어가쟈!!!


이전에 배웠던 클래스를 사용하는 것은 속성과 기능을 가진 객체를 만들겠다는 뜻이라고 한다.

 

아래 여러가지를 배우는데,

  • 상속: 어떤 클래스를 기반으로 속성과 기능을 물려받아 새로운 클래스를 만드는 것
  • isinstance(): 상속관계에 따라서 객체가 어떤 클래스를 기반으로 만들었는지 확인 할 수 있는 것
  • str(): 파이썬이 기본적으로 제공하는 함수

일단 하나씩 파봅시다. 

 

 

 

어떤 클래스의 인스턴스인지 확인하기

위에서 잠깐 설명한것처럼 객체(인스턴스)가 어떤 클래스로부터 나왔는지를 확인하는 isinstance()함수가 있다.

 

isinstance(인스턴스, 클래스)

 

여기서 인스턴스가 해당 클래스의 기반으로 만들어진거면 True, 아니면 False다. 

#클래스 선언 
class Student:
    def __init__(self):
        pass

#학생을 선언
student = Student()

#인스턴스 확인
print("isinstance(student, Student):", isinstance(student, Student))

student는 일단 Student 클래스로 만들었으니까 True를 문제없이 출력해준다.

(역시 공부를 계속 해줘야한다, 위에 클래스 선언하는거 까먹을 뻔..)

 

isinstance()를 통해서 여러 인스턴스 종류가 있을때 구분하면서 속성 기능을 사용할때 쓴다고하는데, 아직은 잘 모르겠드..아..

 

다른 예제를 한번 더 보자. 

 

#학생 클래스 선언 
class Student:
    def study(self):
        print("공부를 합니다")

#선생님 클래스 선언
class Teacher:
    def teach(self):
        print("학생을 가르칩니다")

#교실 내부 객체 리스트 생성
classroom = [Student(), Teacher(), Student(), Teacher(), Teacher()]

#반복적용하고 적절한 함수를 호출하게 하기? 
for person in classroom:
    if isinstance(person, Student):
        person.study()
    elif isinstance(person, Teacher):
        person.teach()

class이름을 학생, 선생님 이렇게 선언 하고 객체리스트를 classroom으로 이름을 말하니까 좀 더 편해보인다..

 

편안...

 

그래서 이런 데이터를 관리할때 종류별로 리스트를 따로 만들고 해야할 수도 있지만, isinstance()함수를 통해 하나의 리스트로도 여러 종류의 데이터를 만질 수 있다. 

 

 

특수한 이름의 매소드

지난번 포스트에서도 그렇고 이번에도 클래스를 사용할때 __()__이런 형태의 함수들이 있었다. 

 

조금 자세하게 알아보고 넘어가야할 듯 싶다.  

 

예제를 보고 이해하는게 빠르기에 설명에 앞서 예제를 보자

 

 

# 클래스 선언 
class Student:
    ##__init__를 통해서 크게 묶어주고 
    def __init__(self, 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): ## 여기서 __str__ 라는 이름으로 함수를 선언
        return "{}\t{}\t{}".format(
        self.name,
        self.get_sum(),
        self.get_average())

    #학생리스트 선언 필요 
students=[
    Student("A", 90, 92, 94, 83),
    Student("B", 89, 93, 80, 99),
    Student("C", 100, 99, 93, 86)
]


#출력
print("이름","총점","평균",sep="\t")
for student in students:
    print(str(student)) ## 여기서 str()함수의 매개변수로 넣으면 student의 __str__()함수가 호출됨?

 

일단  __init__이라는 메서드는 초기화(initialize) 메서드라고도하면서, 어떤 클래스의 객체가 만들어질 때 자동으로 호출되어서 그 객체가 갖게 될 여러 가지 성질을 정해주는 역할을 한다고 한다. 

 

내 방식대로 더 쉽게 말하면,,, 여러가지 설정을 먼저 정의해주는 역할!이라고 생각하면 조금 더 쉽게 이해가 간다.

 

그리고 __str__의 경우 클래스 자체의 내용을 출력하고 싶을 때(init에서 규정한), 형식을 지정하는 방식이고, 조금 더 쉽게 보면 문자열을 쉽게 변환해서 나타낼 수 있다. 

 

내가 말하는 것보다 내가 참조한 블로그를 하나 첨부해놓겠다. 

 

다른 많은 분들도 설명을 잘 해주셨지만, 이분이 조금 직관적으로 설명을 해주셔서 이해하기가 편했다. 

https://velog.io/@tbnsok40/%ED%8C%8C%EC%9D%B4%EC%8D%AC-str-init-%EB%A9%94%EC%84%9C%EB%93%9C

 

파이썬 __str__ , __init__ 메서드

클래스 생성시 자동으로 실행되는 메서드클래스 자체의 내용을 출력하고 싶을 때(init에서 규정한),형식을 지정하는 메서드

velog.io

 

 

그리고 다양하게 __가 붙은 함수들이 많은데, 그것들을 활용한 예제를 한번 보자. 크기 비교할때 좋은 함수들이다. 

 

# 클래스 선언 
class Student:
    ##__init__를 통해서 크게 묶어주고 
    def __init__(self, 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): ## 여기서 __str__ 라는 이름으로 함수를 선언
        return "{}\t{}\t{}".format(
        self.name,
        self.get_sum(),
        self.get_average())

    def __eq__(self, value): #같은놈 
        return self.get_sum() == value.get_sum()
    
    def __ne__(self, value): #다른놈
        return self.get_sum != value.get_sum()
    
    def __gt__(self, value): # 큰놈 greater than, ge= greater than or equal
        return self.get_sum() > value.get_sum()
    
    def __lt__(self, value):  # 작은놈less than, le=less than or eqaul
        return self.get_sum() < value.get_sum()
    
    
    
    #학생리스트 선언 필요 
students=[
    Student("A", 90, 92, 94, 83),
    Student("B", 89, 93, 80, 99),
    Student("C", 100, 99, 93, 86)
]



student_a= Student("A", 90, 92, 94, 83),
student_b= Student("C", 100, 99, 93, 86),



## 출력
print("student_a == student_b : ", student_a == student_b)
print("student_a != student_b : ", student_a != student_b)
print("student_a > student_b : ", student_a > student_b)
print("student_a < student_b : ", student_a < student_b)

 

위의 코드와 동일하지만 중간에 __eq__, __ne__, __gt__, __lt__만 추가해보았다. 

 

비교하는 놈들이 같냐, 다르냐, 크냐(같거나 크냐), 작냐(같거나 작냐) 이런거이기 때문에 뭐 어렵지는 않았는데 살짝 귀찮?..

 


클래스 변수와 메소드는 다음 포스트에 올려봐야겠다. 

 

생각보다 양이 많네...

'Data Analysis > Python_Grammar' 카테고리의 다른 글

[혼공파] 클래스의 추가적인 구문 2  (0) 2022.05.23
[혼공파] 클래스의 기본  (0) 2022.04.16
[혼공파] 외부 모듈  (0) 2022.03.27
[혼공파] 표준 모듈  (0) 2022.03.25
[혼공파] 예외 고급  (0) 2022.03.20

+ Recent posts