Python

python 타입힌트와 데코레이터 여러 예시

sogummi 2023. 4. 1. 20:23
  • 타입 힌트(Type hint) : 변수 또는 함수의 인자에 타입을 지정하는 방식, 선택적 사용이며 코드에는 영향주지 않지만 
    가독성, 유지보수성을 높일 수 있다.

greet 함수는 str, int타입의 인자를 받으며, str타입 값을 반환함을 알려준다.

  • 데코레이터(Decorator) : 다른 함수나 클래스를 수정 또는 꾸며주는 함수
    - 함수/클래스 정의 바로 위 '@' 기호를 사용

 

 

  • 데코레이터의 여러 예시

(1)
my_decorator 함수는 다른 함수를 인자로 받아 새로운 함수 'wrapper'를 반환
@my_decorator는 my_function 함수를 my_decorator함수의 인자로 전달한다. 이후 my_function은 wrapper함수로 대체!
따라서, my_function을 호출해보면  wrapper의 func()위 아래에 있는 출력문장 사이에 "Hello, world!"가 위치하는 것을 알 수 있다. 

(2) 

(3) 
add함수는 @log_decorator로 꾸며져 있는 상태. 따라서 add함수를 호출하면 
log_decorator함수가 add함수를 '수정'한 뒤 반환한 wrapper함수가 실행됨 

(4) 시간 측정 데코레이터 

(5) 곱셈 활용 데코레이터 

 

 


  • 정적메소드
    - 클래스 메소드를 정의할 때 사용되는 데코레이터 
    - 클래스나 클래스 인스턴스의 속성에 접근할 필요 없이, 인자로 받은 값들만 처리되는 메소드
    - 파이썬에서 클래스에서 직접 접근 가능한 2가지 메소드가 staticmethod와 classmethod임
    (하지만 파이썬에서는 정적메소드여도 인스턴스에서 접근 가능함 주의)
    - 인스턴스 생성 없이 클래스 특정 동작을 수행하는 경우에 사용 

1. @staticmethod 
- 정적 메소드 정의 시 사용
- 정적 메소드는 클래스나 인스턴스의 속성을 사용하지 않고, 인자로 전달받은 값만으로 처리되는 메소드
 => 클래스나 클래스 인스턴스의 속성에 접근할 필요가 없는 것은 self, cls를 통해 클래스/인스턴스의 속성을 사용하지 않아도 된다는 것을 의미

- 위 코드에서, my_method는 'self'를 통해서 self.my_instance_variable 이라는 인스턴스 변수에 접근
- 반면, my_static_method는 클래스나 인스턴스의 속성을 사용하지 않고 인자로 전달받은 x,y만으로 계산 => 정적 메소드

- 위 코드에서 my_static_method는 정적 메소드로 정의 되어 있음
- 첫 번째 인자로 MyClass를 받아서 MyClass.x와 y를 더한 값을 반환

 

2. @classmethod
- 클래스 메소드를 정의할 때 사용
- 클래스 레벨에서 동작, 클래스 레벨에서 사용되는 속성을 조작할 때 사용 
- 첫 번째 인자로 클래스 자체를 전달 받ㅇ므

- 위 코드에서, get_count메소드는 클래스 메소드로 정의
- 첫 번째 인자로 'cls'받음 -> 해당 클래스 자체를 나타냄 (cls.count = Person.count)
- Person.get_count()와 같이 클래스 자체에서 바로 호출 -> Person클래스에서 생성된 인스턴스 개수 구할 수 있음
- 출력결과 : 2 (인스턴스는 person1, person2만 생성됨을 알 수 있음) 





아직 처음 접한 개념이라 조금 어려워서 나중에 더 추가할 예정.. ! 


출처 및 참고 : 스파르타코딩-파이썬 심화