Python staticmethod
Python staticmethod๋ @staticmethod ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์ ๋ฉ์๋ ์ ๋๋ค.
- ์ธ์คํด์ค ๋ฉ์๋์๋ ๋ค๋ฅด๊ฒ self ์ธ์๋ฅผ ๋ฐ์ง ์๋๋ค.
- ํด๋์ค ์ด๋ฆ์ผ๋ก ์ง์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
- ์ธ์คํด์ค ์์ฑ์ ์ ๊ทผํ๊ฑฐ๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
์ด๋ฐ ํน์ง๋ค์ด ์์ด์ ์ ํธ๋ฆฌํฐ์ฑ ๋ฉ์๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ ํธ๋ฆฌํฐ์ฑ ๋ฉ์๋๋ค์ ์ฃผ๋ก ๋ฐ๋ก utils๋ผ๋ ๋ชจ๋๋ก ๋นผ์ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ... ํด๋์ค ๋ด์์๋ ์ staticmethod๊ฐ ํ์ํ ๊น์? ์๋ ์ค์ต์ ํตํด์ ์ข ๋ ์์ธํ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Playlist ์ค์ต
import random
import json
import hashlib
class Playlist:
class NoMusicInPlayListException(Exception):
"""Raised when music is not in the playlist."""
pass
def __init__(self):
self._playlist = []
self.current_play = None
def show(self):
print(self._playlist)
def add(self, music):
self._playlist.append(music)
def remove(self, title):
for music in self._playlist:
if music['title'] == title:
self._playlist.remove(music)
break
def play(self, title):
for music in self._playlist:
if title == music['title']:
self.current_play = music
print(f'"{self.current_play["title"]}" is playing...')
break
else:
raise self.NoMusicInPlayListException(f'"{music}" is not in the playlist.')
def random_play(self):
self.current_play = random.choice(self._playlist)
print(f'"{self.current_play["title"]}" is playing...')
@staticmethod
def playtime_diff(music1, music2):
return abs(music1['play_time'] - music2['play_time'])
@staticmethod
def hash(music):
music_str = json.dumps(music, sort_keys=True).encode()
return hashlib.sha256(music_str).hexdigest()
if __name__ == "__main__":
p = Playlist()
p.add({"title": "Circle", "artist": "Post Malone", "play_time": 3.47})
p.add({"title": "Better Now", "artist": "Post Malone", "play_time": 3.53})
p.show()
p.random_play()
print(p.hash({"title": "Better Now", "artist": "Post Malone"}))
print(
p.playtime_diff(
{"title": "Circle", "artist": "Post Malone", "play_time": 3.47},
{"title": "Better Now", "artist": "Post Malone", "play_time": 3.53}
)
)
์ ์ฝ๋๋ ๊ฐ๋จํ๊ฒ Playlist๋ฅผ ๋ง๋ค์ด์ ๋ ธ๋๋ฅผ ์ถ๊ฐ, ์ญ์ ํ๊ณ ์ฌ์ํ๋ ํ์์ ํด๋์ค๋ฅผ ์์ฑํ์ต๋๋ค. staticmethod๋ก playtime_diff์ hash ํจ์๋ฅผ ์์ฑํ์ต๋๋ค.
๋ ํจ์๋ค์ ๊ณตํต์ ์ ํด๋์ค์ ์์กดํ์ง ์๊ณ ์ ํธ๋ฆฌํฐ์ฑ ํจ์๋ผ๋ ๊ฒ์ ๋๋ค. ์... ์ด์จ๋ music์ด๋ผ๋ ๋์ ๋๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ค๊ณ ๊ฐ์ผํ๊ธฐ ๋๋ฌธ์ ์์ ผํ ์์กดํ์ง ์๋๋ค๊ณ ๋ ํ ์ ์์ต๋๋ค. ํ์ง๋ง... ํด๋์ค ๋ด์ ๋ค๋ฅธ ์์ฑ์ด๋ ํจ์์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ํธ๋ฆฌํฐ์ฑ ํจ์๋ก staticํ๊ฒ ์ ์ํ๋ ๊ฒ์ด ๋ง๋ค๊ณ ํ๋จ ๋ฉ๋๋ค.
์ ๊ฐ ๋ค๋ฅธ Python ์ฝ๋๋ค์ ๋ณด๋ฉด์ ๋งค๋ฒ "์ ์ด ํจ์๋ฅผ staticmethod๋ก ์ ์ํ๋์ง..." ์๋ฌธ์ ๊ฐ์ก์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋๋ถ๋ถ ๊ฐ์ ํจํดํ๋๊ฐ ์์์ต๋๋ค. self๋ฅผ ์ด์ฉํด์ ํด๋์ค์ ์์ฑ์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ... ์ฆ, ์์กด์ฑ์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ staticmethod๋ก ์ ์ํ์ค๋น๋ค.
staticmethod ์ฅ์
static method๋ ๋จ์ํ ์ ํธ๋ฆฌํฐ์ฑ ํจ์์ ์ฌ์ฉํ๋ค๋ผ๊ณ ์ดํดํ๊ธฐ ๋ณด๋ค๋... ์๋ 4๊ฐ์ง ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- self ์ธ์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
- ์ธ์คํด์คํํ ๋ static method์ ๋ํด์๋ bound-method๋ฅผ ์์ฑํด์ค ํ์๊ฐ ์์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์๋ค.
- ์ธ์คํด์ค ์ค๋ธ์ ํธ ์์ฒด์ ์์กดํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ์ฌ ์ฝ๋์ ๊ฐ์์ฑ์ด ์ข์์ง๋ค.
๋๊ธ