[Day4] 파이썬 기초 문법III

 

중요

@property

class Person:
    def __init__(self):
        self.age = 0

john=Person()
print(john.age)  # 0
john.age=28
print(john.age)  # 28

파이썬에서 다음과 같이 class를 정의하게 되면 age직접 접근하여 값을 바꿀 수 있다. 이게 문제가 된다.

 

왜냐하면 클래스를 만들고 변수를 바꿀 때 보통 함수를 통해서 변수를 바꾼다. 이유는 변수의 조건 등을 줄 수 있기 때문이다. age의 값을 바꿀 때 사용자가 정수의 값이 아닌 문자열 값을 넣는다면, error문구를 내보내야 한다.

class Person:
    def __init__(self):
        self.age = 0
        
    def set_age(self,val):
        if type(val) == int:
            self.age=val
        else:
            print('숫자 값을 입력해 주세요!!')
            
john=Person()
john.set_age('seven')  # 숫자 값을 입력해 주세요!!
john.set_age(28)
print(john.age)        # 28
john.age='seven'
print(john.age)        # 'seven'

여기서 직접 접근하여 값을 바꿀 수 있다면 age의 값은 'seven'으로 바뀔 수 있고 이것은 class구조가 이상해 질 수 있다.

 

이렇게 직접 접근을 막기 위해 변수 앞에__을 붙여 준다.

class Person:
    def __init__(self):
        self.__age = 0

john=Person()
print(john.__age)    # error발생 직접 접근 불가

 

클래스에서 메서드를 통하여 속성의 값을 가져오거나 저장하는 경우. 값을 가져오는 메서드를 getter, 값을 저장하는 메서드를 setter로 부른다.

class Person:
    def __init__(self):
        self.__age = 0
 
    def get_age(self):           # getter
        return self.__age
    
    def set_age(self, val):      # setter
        if type(val) == int:
            self.__age = val
        else:
            print('숫자 값을 입력해 주세요!!')

john=Person()
john.set_age('str')    # 숫자 값을 입력해 주세요!!
john.set_age(20)
print(john.get_age())  # 20

이렇게 함수를 통해서 접근하게 되는데 @property를 사용하면 getter, setter를 간단하게 구현할 수 있습니다.

  • @property
  • @메서드이름.setter
class Person:
    def __init__(self):
        self.__age = 0
 
    @property
    def age(self):           # getter
        return self.__age
 
    @age.setter
    def age(self, val):    # setter
        if type(val) == int:
            self.__age = val
        else:
            print('숫자 값을 입력해 주세요!!')

john=Person()
john.age='seven'     # 숫자 값을 입력해 주세요!!
print(john.age)      # 0
john.age=20
print(john.age)      # 20

getter, setter 메서드의 이름을 잘 보면 둘다 age이다. 그리고 getter에는 @property가 붙어있고, setter에는 @age.setter가 붙어있다. 즉, 값을 가져오는 메서드에는 @property 데코레이터를 붙이고, 값을 저장하는 메서드에는 @메서드이름.setter 데코레이터를 붙이는 방식이다. 변수에 직접 접근하는 것 처럼 보이지만 실제로는 변수에 직접 접근하고 있지 않다는 것을 john.age='seven'이 숫자 값을 입력해 주세요!!! 구문을 출력한 걸 보면 알 수 있다.

 

 

피어세션

  • 파이썬 디버깅 : pythontutor

  • try - except를 생활화

  • Git을 과제에 적용

    1. Git을 통한 협업 연습
    2. 멋진(효율적이고 깔끔) 코드 제작

 

 

과제

정규표현식

정규표현식에서 메타 문자가 존재하는데 []안에 메타 문자를 넣으려면 다음과 같은 메타 문자는 \를 붙어 줘야한다.

import re
special_chr=re.compile('[문자열]')

여기서 문자열에 메타 문자를 넣게 되면 \를 넣어서 표현 해 주어야 한다. \, [,], .,*,+,{,},?,|,^,$로 총 12개가 메타 문자이다. is_validated_english_sentence함수를 만들때 특수 문자를 체크하는 부분에서 사용.

+ Recent posts