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_박두진강사님