반응형
데코레이터는 간단하게 아래처럼 중첩해서 사용하면 된다.
@decor1
@decor
def num():
statement(s)
그런데~ 아무생각 없이 @staticmethod와 중첩해서 사용하니 에러가 발생했다.
@staticmethod @classmethod와 중첩시 유의점
- @staticmethod @classmethod가 바깥에 와야한다(먼저) 안그러면 아래와 같은 AttributeError가 발생한다.
Traceback (most recent call last):
File "/opt/conda/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/opt/conda/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/hoseung2/.local/lib/python3.6/site-packages/memory_profiler.py", line 1349, in <module>
exec_with_profiler(script_filename, prof, args.backend, script_args)
File "/home/hoseung2/.local/lib/python3.6/site-packages/memory_profiler.py", line 1250, in exec_with_profiler
exec(compile(f.read(), filename, 'exec'), ns, ns)
...
File "/home/hoseung2/.local/lib/python3.6/site-packages/memory_profiler.py", line 1186, in wrapper
val = prof(func)(*args, **kwargs)
File "/home/hoseung2/.local/lib/python3.6/site-packages/memory_profiler.py", line 715, in __call__
f.__module__ = func.__module__
AttributeError: 'staticmethod' object has no attribute '__module__'
왜 이렇게 써야할까?
- 적용순서: inner -> outer, 데코레이터는 안쪽에 있는 것부터 바깥쪽으로 작용한다.
- descriptor: 다른 데코레이터와 달리 classmethod와 staticmethod는 descriptor를 반환한다.
- 때문에 classmethod와 staticmethod 적용 시 이 둘을 가장 top!!! outer!!! 에 배치하자!
참고자료
반응형
'기술스택을 쌓아보자 > Python' 카테고리의 다른 글
[조각 pandas] nsmallest, nlargest, serise.quantile로 상위 및 하위 n 개 n% 값 가져오기(각각 행과 열에서 ) (0) | 2022.06.10 |
---|---|
[python] requests 로 OPENAPI /API 사용하는 코드 샘플 (0) | 2022.06.06 |
[조각pandas] 랜덤한 행, 열 고르기(choose random rows/columns), df.sample() (0) | 2021.12.05 |
[pandas] 데이터프레임이 먹고있는 메모리 확인하기(Out Of Memory 디버깅의 시작이 아닐까?) (0) | 2021.08.18 |
[pandas/parquet] pandas 가이드중 parquet 관련 부분 공부 및 번역 (0) | 2021.08.03 |
댓글