TIL

[TIL] 10일차 PYTHON_Class_IO_01

Molybdenum_j 2023. 3. 3. 18:43

▶ getter, setter

객체의 내부 변수에 접근할 때 특정 메서드를 거쳐서 접근할 수 있도록 하는 방법

  • getter() : 데이터를 읽어주는 메서드
  • setter() : 데이터를 변경해주는 메서드

예시 <패스워드를 맞췄을 시에 앞에 두자리만 보이고 *로만 출력하기(+패스워드변경)>

@propperty 데코레이터를 사용하여 코딩

class Person:

    def __init__(self, pw):
        self.hidden_pw = pw
    
    @property
    def pw(self):
        print('getter')
        return self.hidden_pw[:2] + '****'

    @pw.setter
    def pw(self, new_pw):
        print('setter')
        input_pw = input('insert password : ')
        if input_pw == self.hidden_pw:
            self.hidden_pw = new_pw
        else:
            print('wrong password!')

 

property()함수 사용하여 코딩 <- 좀 더 깔끔하게 getter/setter 메서드가 호출되게 할 수 있음.

class Person:

    def __init__(self, pw):
        self.hidden_pw = pw
    
    def getter(self):
        print('getter')
        return self.hidden_pw

    def setter(self, new_pw):
        print('setter')
        self.hidden_pw = new_pw

    pw = property(getter, setter)

 

▶mangling : 변수에 이름을 바꿔 직접적으로 접근하는 것을 막는 방법

  • 사용법 : 변수명 앞에 __를 붙임
  • 클래스의 속성값을 외부에서 접근하기 어렵게 (private화)하거나 하위클래스가 상위클래스의 속성을 오버라이딩 하는 것을 막을 때 사용

 


 

▶ 메서드의 종류

  • 인스턴스 메서드 : 파라미터 self : 객체를 이용하여 메서드 호출
  • 클래스 메서드 : 파라미터 cls : 클래스를 이용하여 메서드 호출 : 객체로 생성된 초기 변수값을 모두 수정
  • 스태틱 메서드 : 파라미터 x : 객체를 선언하지 않고 메서드 호출
class Account:

    interest = 1.01 # 이자율 1%

    def __init__(self, asset=10000):
        self.asset = asset

    def deposit(self, amount):
        self.asset += amount
    
    def withdraw(self, amount):
        if self.asset >= amount:
            self.asset -= amount
        else:
            print('total asset', self.asset)

    def add_interest(self):
        self.asset = int(self.asset * self.interest)
        print('total asset', self.asset)

    def change_interest(self, interest):
        if interest < 1.10:
            self.interest = interest
        else:
            print('이자율을 10% 미만으로 설정해주세요.')

    @classmethod
    def cls_change_interest(cls, interest):
        if interest < 1.10:
            cls.interest = interest
        else:
            print('이자율을 10% 미만으로 설정해주세요.')
    
    @staticmethod
    def interest_grade(interest):
        if interest > 1.05:
            print('high interest')
        elif interest > 1.02:
            print('middle interest')
        else:
            print('low interest')
account1 = Account(10000)
account2 = Account(20000)
account3 = Account(30000)
account1.asset, account2.asset, account3.asset,\
account1.interest, account2.interest, account3.interest

(10000, 20000, 30000, 1.01, 1.01, 1.01)

 

 

▶인스턴스 메서드 사용

  • 인스턴스변수에 엑세스 할 수 있도록 첫번 째 인자에 항상 객체 자신을 의미하는 self파라미터를 갖는다.
  • 호출방법 : 클래스 안에서는 self.메서드명 / 클래스 밖에서는 객체.메서드명
account1.change_interest(1.09)
account1.asset, account2.asset, account3.asset,\
account1.interest, account2.interest, account3.interest

(10000, 20000, 30000, 1.09, 1.01, 1.01)

 

▶ 클래스 메서드 사용

  • 해당 클래스로부터 만들어진 객체의 변수를 한꺼번에 변경할 때 사용한다.
  • self 파라미터 대신 cls라는 클래스를 의미하는 파라미터를 갖는다.
  • 객체로부터 호출되는 것이 아니라 클래스 자체에서 직접 호출된다.
  • 호출 방법 : 클래스명.클래스메서드명 또는 객체명.클래스메서드명 둘 다 호출가능
Account.cls_change_interest(1.04)
account1.asset, account2.asset, account3.asset,\
account1.interest, account2.interest, account3.interest

(10000, 20000, 30000, 1.09, 1.04, 1.04)

 

▶ 스태틱 메서드 사용

  • 클래스 메서드와 스태틱 메서드의 차이 : 클래스 메서드는 클래스의 변수에 접근이 가능하다.
  • self 파라미터를 가지고 있지 않다. 따라서 인스턴스 변수에 액세스가 불가능하다. 그러나 스태틱 메서드 내부에서 클래스변수에는 클래스명.클래스속성명으로 엑세스가 가능하다.
  • 인스턴스 상태를 변화시키지 않는 메서드를 만들 때 사용한다.
  • 호출방법 : 클래스 명. 정적메서드 명 또는 객체명. 정적메서드명 둘 다 호출가능하지만, 전자를 주로 사용한다.
Account.interest_grade(account1.interest)
Account.interest_grade(account2.interest)

high interest
middle interest

 

▶ 클래스 설계

  • is a, has a 개념
  • is a : A is a B : 상속을 이용해서 클래스 설계
  • has a : A has a B : 객체를 객체에 넣어서 클래스 설계

       두가지 방법을 혼용해서 사용한다.

  • is a
class Info:
    def __init__(self, name, email):
        self.name = name
        self.email = email
class Person(Info):
    def show(self):
        print(self.name, self.email)
class Person(Info):
    def show(self):
        print(self.name, self.email)

 

  • has a
class Name:
    def __init__(self, name):
        self.name_str = name

class Email:
    def __init__(self, email):
        self.email_str = email
class Person:
    def __init__(self, name_obj, email_obj):
        self.name = name_obj
        self.email = email_obj
    def show(self):
        print(self.name.name_str, self.email.email_str)
name_obj = Name('peter')
email_obj = Email('peter@gmail.com')
person = Person(name_obj, email_obj)
person.show()

peter peter@gmail.com

 

 

출처-멋쟁이사자처럼_AISCHOOL_박두진강사님