๐ญ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด
์ฑ๊ธํค ๋์์ธ ํจํดโ
๋ชจ๋ ๋ ๋ฒจ ์ฑ๊ธํค (๊ฐ์ฅ Pythonicํ ๋ฐฉ๋ฒ)โ
-
ํ์ด์ฌ ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ฒ๋ผ ๋์ํฉ๋๋ค. ๋ชจ๋์ ํ๋ก๊ทธ๋จ ๋ด์์ ์ต์ด import ์ ๋จ ํ ๋ฒ๋ง ๋ก๋๋๊ณ ์ด๊ธฐํ๋ฉ๋๋ค.
-
๋ฐ๋ผ์ ๋ชจ๋ ์์ฒด๋ฅผ ์ฑ๊ธํค ์ธ์คํด์ค์ฒ๋ผ ์ฌ์ฉํ๊ฑฐ๋, ๋ชจ๋ ๋ด์ ํ์ํ ๊ฐ์ฒด๋ ๋ณ์๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ํ์ด์ฌ๋ค์ด ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ฒจ์ง๋๋ค.
# config.py (๋ชจ๋ ํ์ผ)
_db_connection = None # ์์: DB ์ฐ๊ฒฐ ๊ฐ์ฒด (์ค์ ๋ก๋ ์ฐ๊ฒฐ ๋ก์ง ํ์)
_settings = {"theme": "dark", "version": "1.0"}
def get_db_connection():
global _db_connection
if _db_connection is None:
print("Creating DB connection...")
# ์ค์ DB ์ฐ๊ฒฐ ๋ก์ง
_db_connection = "Connected DB Object"
return _db_connection
def get_setting(key):
return _settings.get(key)
def update_setting(key, value):
_settings[key] = value
# main.py (์ฌ์ฉํ๋ ๋ค๋ฅธ ํ์ผ) ########## ์ฌ๊ธฐ๋ ๋ค๋ฅธ ํ์ผ ##########
import config # config ๋ชจ๋์ ์ํฌํธ
conn1 = config.get_db_connection()
conn2 = config.get_db_connection() # "Creating DB connection..."์ ํ ๋ฒ๋ง ์ถ๋ ฅ๋จ
print(f"conn1 is conn2: {conn1 is conn2}") # ์ถ๋ ฅ: conn1 is conn2: True
print(config.get_setting("theme")) # ์ถ๋ ฅ: dark
config.update_setting("theme", "light")
print(config.get_setting("theme")) # ์ถ๋ ฅ: light
์ฌ์ค ๋ค๋ฅธ ํจํด์ ์ํ์ ์์ง๋ง ๊ทธ๋๋ ํ๋ฒ ์์ฑํด๋ด ๋๋ค.โ
new ๋ฉ์๋๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒโ
-
ํด๋์ค์ new ๋ฉ์๋๋ init ๋ณด๋ค ๋จผ์ ํธ์ถ๋์ด ๊ฐ์ฒด ์์ฑ์ ์ ์ดํฉ๋๋ค.
-
ํด๋์ค ๋ณ์์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๊ณ , new ๋ฉ์๋์์ ์ธ์คํด์ค๊ฐ ์ด๋ฏธ ์์ฑ๋์๋์ง ํ์ธํ์ฌ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ฑฐ๋ ์๋ก ์์ฑํฉ๋๋ค.
class SingletonClass:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
print("Creating new instance")
# ์ ์ธ์คํด์ค ์์ฑ (super() ์ฌ์ฉ)
cls._instance = super().__new__(cls)
# ์ฌ๊ธฐ์ ์ถ๊ฐ ์ด๊ธฐํ๊ฐ ํ์ํ๋ฉด ํ ์ ์์ง๋ง, __init__์์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์
else:
print("Returning existing instance")
return cls._instance
def __init__(self, data):
# __init__์ __new__๊ฐ ์ธ์คํด์ค๋ฅผ ๋ฐํํ ๋๋ง๋ค ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์ ํ์
# ์๋์ฒ๋ผ ์ด๊ธฐํ๊ฐ ํ ๋ฒ๋ง ๋๋๋ก ๋ฐฉ์ด ์ฝ๋๋ฅผ ๋ฃ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
if not hasattr(self, '_initialized'):
print(f"Initializing instance with data: {data}")
self.data = data
self._initialized = True
else:
print(f"Instance already initialized (data: {self.data})")
# ์ฌ์ฉ ์์
s1 = SingletonClass("Data 1")
print(f"s1 data: {s1.data}")
s2 = SingletonClass("Data 2") # __new__๋ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ฐํํ์ง๋ง, __init__์ ๋ ํธ์ถ๋จ
print(f"s2 data: {s2.data}") # ์ถ๋ ฅ: s2 data: Data 1 (s1๊ณผ ๊ฐ์ ๊ฐ์ฒด์ด๋ฏ๋ก data๊ฐ ๋ฐ๋์ง ์์)
print(f"s1 is s2: {s1 is s2}") # ์ถ๋ ฅ: s1 is s2: True