파이썬 심화 (클래스,메소드)

팔리동·2021년 4월 14일
0

클래스 메소드

class Student(object):
    '''
    Student class
    Author : sdk
    Date : 2021.04.13
    Description : Class, Static, Instance Method
    '''
    
    # Class 변수
    tuition_per = 1.0

    def __init__(self, id, first_name, last_name, email , grade, tuition, gpa):
        self._id = id
        self._first_name = first_name
        self._last_name = last_name
        self._email = email 
        self._grade = grade
        self._tuition = tuition 
        self._gpa =gpa

    # Instance Method
    def full_name(self):
        return '{} {}'.format(self._first_name, self._last_name)

    # Instance Method 
    def detail_info(self):
        return 'Student Detail Info: {},{},{},{},{},{}'.format(self._id,self.full_name(), self._email, self._grade, self._tuition, self._gpa)

    # Instance Method 
    def get_fee(self):
        return 'Before Tuition -> Id : {}. fee : {}'.format(self._id, self._tuition)
    
    # Instance Method
    def get_fee_culc(self):
        return 'After tuition -> Id : {}, fee : {}'.format(self._id, self._tuition * Student.tuition_per)

    # Instance Method
    def __str__(self):
        return 'Student Info -> name : {} grade : {} email : {}'.format(self.full_name(), self._grade, self._email)

    # Class Method
    @classmethod
    def raise_fee(cls, per):
        if per <= 1:
            print('Please Enter 1 or More')
            return
        cls.tuition_per = per 
        print('Succed! tuition increased!')
        # cls는 Student클래스와 같다. 
        
       	 # Class Method
    @classmethod
    def student_const(cls, id, first_name, last_name, email, grade, tuition, gpa):
        return cls(id, first_name, last_name, email, grade, tuition * cls.tuition_per, gpa)

    # Static Method 
    @staticmethod
    def is_scholarship_st(inst):
        if inst._gpa >= 4.3:
            return '{} is a scholarship recipient.'.format(inst._last_name)
        return 'Sorry. Not a scholarship recipient.'


    

# 학생 인스턴스 
student_1 = Student(1, 'kim', 'Sarang', 'student1@naver.com', '1', 400, 3.5)
student_2 = Student(2, 'Lee', 'Myungho', 'student2@naver.com', '2', 500, 4.3)

print(student_1) # Student Info -> name : kim Sarang grade : 1 email : student1@naver.com
print(student_2) # Student Info -> name : Lee Myungho grade : 2 email : student2@naver.com
print()

# 전체 정보 
print(student_1.detail_info()) # Student Detail Info: 1,kim Sarang,student1@naver.com,1,400,3.5
print(student_2.detail_info()) # Student Detail Info: 2,Lee Myungho,student2@naver.com,2,500,4.3

# 학비 정보(인상전)
print(student_1.get_fee()) # Before Tuition -> Id : 2. fee : 400
print(student_2.get_fee()) # Before Tuition -> Id : 2. fee : 500

print()

# 학비 인상 (클래스 메소드 미사용)
# Student.tuition_per = 1.2

# 학비 인상 (클래스 메소드 사용)
Student.raise_fee(1) # Please Enter 1 or More

# 학비 정보(인상후)
print(student_1.get_fee_culc()) # After tuition -> Id : 1, fee : 400.0
print(student_2.get_fee_culc()) # After tuition -> Id : 2, fee : 500.0

# 클래스 메소드 인스턴스 생성 실습 
student_3 = Student.student_const(3, 'Park', 'Minji', 'student3@gmail.com', '3', 550, 4.5) 
student_4 = Student.student_const(3, 'Cho', 'Sunghan', 'student4@gmail.com', '4', 600, 4.1)

# 전체 정보 
print(student_3.detail_info()) ##Student Detail Info: 3,Park Minji,student3@gmail.com,3,715.0,4.5
print(student_4.detail_info())

# 학생 학비 변경 확인 
print(student_3._tuition) # 715.0 (위에 Student.raise_fee(1.3)이 있어서)
print(student_4._tuition)
print()

# 장학금 혜택 여부(스테틱 메소드 미사용)
def is_scholarship(inst):
    if inst._gpa >= 4.3:
        return '{} is a scholarship recipient.'.format(inst._last_name)
    return 'Sorry. Not a scholarship recipient.'

print(is_scholarship(student_1))
print(is_scholarship(student_2))
print(is_scholarship(student_3))
print(is_scholarship(student_4))
print()
# 장학금 혜택 여부(스테틱 메소드 사용)
print(Student.is_scholarship_st(student_1))
print(Student.is_scholarship_st(student_2))
print(Student.is_scholarship_st(student_3))
print(Student.is_scholarship_st(student_4)) 
print()
print(student_1.is_scholarship_st(student_1))
print(student_2.is_scholarship_st(student_2))
print(student_3.is_scholarship_st(student_3))
print(student_4.is_scholarship_st(student_4))
# 스태틱 메소드는 인자로 (inst)하나만 받아도 된다. 
  • 클래스 메소드를 사용하면 클래스 변수를 직접 바꾸지 않고 인자로 받아서 접근 할 수 있다. (아래 코드에 클래스 메소드 참조)
  • 스태틱 메소드는 인자로 (inst)하나만 받는다. 클래스 메소드 처럼 인자를 cls,xxx,xxx 이렇게 안받아도 된다.
  • 스태틱 메소드를 호출에서 쓰려면 print(student_1.is_scholarship_st(student_2))이렇게 인자에 인스턴스를 넣어야 한다. 안넣으면 오류가 난다. 이유는 내용물에 inst._gpa가 있기 때문이다.

Class Method

@classmethod
def raise_fee(cls, per):
    if per <= 1:
        print('Please Enter 1 or More')
        return
    cls.tuition_per = per 
    print('Succed! tuition increased!')
    # cls는 Student클래스와 같다. 
profile
배움의 기록

0개의 댓글