728x90
반응형
  • 데코레이터
    • 함수를 매개변수로 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환함으로써 기존의 코드에 수정 없이 여러가지 기능을 추가하는 파이썬 구문
    • 데코레이터 만들기 (출처 - 코딩도장)
    def trace(func):                             # 호출할 함수를 매개변수로 받음
        def wrapper():                           # 호출할 함수를 감싸는 함수
            print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
            func()                               # 매개변수로 받은 함수를 호출
            print(func.__name__, '함수 끝')
        return wrapper                           # wrapper 함수 반환
     
    def hello():
        print('hello')
     
    def world():
        print('world')
     
    trace_hello = trace(hello)    # 데코레이터에 호출할 함수를 넣음
    trace_hello()                 # 반환된 함수를 호출
    trace_world = trace(world)    # 데코레이터에 호출할 함수를 넣음
    trace_world()                 # 반환된 함수를 호출
    
    • 호출할 함수 위에 @데코레이터 형식으로 지정할 수 있다. (출처 - 코딩도장)
    @trace    # @데코레이터
    def hello():
        print('hello')
     
    @trace    # @데코레이터
    def world():
        print('world')
     
    hello()    # 함수를 그대로 호출
    world()    # 함수를 그대로 호출
    
    '''''''''
    hello 함수 시작
    hello
    hello 함수 끝
    world 함수 시작
    world
    world 함수 끝
    '''''''''
    
    • 데코레이터는 여러 개 지정할 수 있다. 이때 데코레이터의 실행 순서는 위에서 아래
      • @를 사용하지 않았을 때 : decorated_hello = decorator1(decorator2(hello)) // decorated_hello()
    • 클래스로 만드는 데코레이터 구조
    class Decorator:
    
        def __init__(self, function):
            self.function = function
    
        def __call__(self, *args, **kwargs):
            return self.function(*args, **kwargs)
    
    class Decorator:
    
        def __init__(self, function):
            self.function = function
    
        def __call__(self, *args, **kwargs):
            print('전처리')
            print(self.function(*args, **kwargs))
            print('후처리')
    @Decorator
    def example():
        return '클래스'
    example()
    '''''''''
    전처리
    클래스
    후처리
    '''''''''
    
  • 가변 객체와 불변 객체
    • 객체의 정의 : 어떠한 속성값과 행동을 가지고 있는 데이터
    • 객체는 3가지 특징을 가진다.
      1. 값(value) : 메모리에 기록된 내용. 가변 객체는 값이 변할 수 있지만 불변 객체는 변하지 않는다.
      2. 유형(type) : type() 함수를 통해 객체의 유형을 알 수 있으며 데이터의 종류를 보여준다.
      3. 정체성(identity) : id() 함수를 통해 알 수 있으며 각각의 객체를 식별하기 위한 고유번호(메모리 상에 위치한 주소 값)
    • 가변 객체 : 객체에 할당된 값을 수정할 수 있다. → list, set, dict
    • 불변 객체 : 객체에 할당된 값을 수정할 수 없다. → int, float, bool, tuple, string, unicode
      • 예시 : tuple의 요솟값을 변경할 수 없기 때문에 새로운 tuple 인스턴스를 같은 이름의 변수에 할당하는 방법으로 변수가 가리키는 대상을 바꿔야 한다.
  • set 자료형과 dict 자료형의 차이
    • 공통점
      1. 중복값을 없애준다
      2. {} 사용
      3. 파이썬에서 dict 자료형의 키값은 해시가 가능토록 설계돼야 하므로 해시 키의 유일성을 해치지 않도록 가변 객체를 dict의 키값이나 set의 원소로 사용할 수 없다.
    • 차이점
      1. dict는 Set 과 달리 키-밸류 쌍으로 데이터를 표현한다.
      2. set은 보통 list의 중복값 삭제를 위해 사용한다.
      3. dict는 사전처럼 키로 밸류값을 찾기 위해 사용한다.
  • list 자료형과 tuple 자료형의 차이
    • 공통점
      1. 어떠한 자료형이든 안에 값으로 저장할 수 있다.
      2. 안에 리스트나 튜플을 추가해 다차원 리스트를 만들 수 있다.
      3. 중복된 값도 넣을 수 있다.
      4. 둘 다 순차자료형이다.
    • 차이점
      1. list는 [], tuple은 ()
      2. list는 비교적 리소스를 많이 사용하는 대신 추가 및 수정이 가능하다. → 가변객체다.
      3. tuple은 생성 후 추가 및 수정이 불가한 대신 리소스를 비교적 적게 사용한다. → 불변객체다.
  • assert
    1. 뒤에 오는 조건이 False면 AssertionError를 발생시킨다.
    2. assert 조건, “에러문”의 형식으로 사용할 수도 있다.
    3. 따라서 assert는 조건을 만족하지 않을 경우 강제종료 시킴으로써 조건을 보장한다.
def test(t):
    assert type(t) is int, '정수 아님'

for i in lists:
    test(i)
#결과
AssertionError: 정수 아님
  • raise
    • 강제로 예외를 발생시켜 별도로 처리한다
if not re.search(password_reg, str(password)):
    raise serializers.ValidationError(detail={"password":"최소 한 개의 영문자와 숫자를 포함해 5글자 이상으로 만들어 주세요."})
elif password != password_check:
    raise serializers.ValidationError(detail={"password":"동일한 비밀번호를 입력해 주세요."})
  • try except문과 함께 쓰이는 경우가 잦다.
  • TypeError나 NameError처럼 deserved된 에러가 아니라 자신이 만든 특정 상황의 에러가 발생한 경우 별도 처리를 할 수도 있다.
반응형

+ Recent posts