getattr(객체, 속성 이름 [, 속성이 없을 때 반환 값])
getattr(...)
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case.
class 통장:
def __init__(self, 개설_축하_금액):
"""통장 개설!!ㅊㅊ"""
self.통장액수 = 개설_축하_금액
def 입금(self, 입금액):
self.통장액수 += 입금액
def 출금(self, 출금액):
self.통장액수 -= 출금액
테스트_통장 = 통장(5000)
x = input('입금 or 출금?') # 입금
y = input('얼마나?')
테스트_통장.x(int(y)) # SyntaxError, 테스트_통장."입금"(int(5000))
if x == '입금':
return 테스트_통장.입금(int(y))
elif x == '출금':
return 테스트_통장.출금(int(y))
x = input('입금 or 출금?') # 입금
y = input('얼마나?')
func = getattr(테스트_통장, x) # 테스트_통장."입금" >>> 테스트_통장.입금
func(int(y))
getattr(객체, 속성 이름, 지정 값)
setattr(obj, name, value, /)
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
hasattr(객체, 속성 이름)
hasattr(obj, name, /)
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
if not hasattr(테스트_통장, x): return "입력 제대로!";
delattr(객체, 속성 이름)
delattr(obj, name, /)
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''
페이히어 기업과제로 가계부를 만들기를 받았다. django를 사용했고,
지출에 해당하는 것만 구현하면 됐지만, 상세 내용에 수입/지출의 값을 넣고 싶었다. 또한 일별 총 수입/지출의 값을 넣으려 설계했다.
그러기 위해서 상세 내용의 수입/지출 내역을 쓰면 일별 수입/지출 또한 바뀌어야했다.
그래서 생성/삭제 시에 변경되는 값을 바꾸기 위해 아래와 같이 만들었는데 getattr과 setattr을 사용하면 확장성 있게 바뀔 수 있겠다.
def add_income_expense(self, instance):
money_type = instance.money_type
is_expense = True if money_type == '0' else False
if is_expense:
instance.day_log.expense += instance.money
else:
instance.day_log.income += instance.money
def sub_income_expense(self, instance):
money_type = instance.money_type
is_expense = True if money_type == '0' else False
if is_expense:
instance.day_log.expense -= instance.money
else:
instance.day_log.income -= instance.money
func_dict = {
"add" : lambda x,y : x+y,
"sub" : lambda x,y : x-y,
}
money_type = {
"0" : "expense",
"1" : "income"
}
def add_or_sub_income_expense(self, instance, op):
money_type = instance.money_type
func = func_dict[op]
x = getattr(instance.day_log, money_type[money_type])
money = func(x, instance.money)
setattr(instance.day_log, income_or_expoense[money_type], money)