๐ [Python] แแ ณแฏแ แ ขแแ ณ & แแ ฆแแ ฉแแ ณ แแ ตแทแแ ช - 3แแ ฎ
on
์ฝ๋
class Car():
"""
Car class
Author : Lee
Date : 2021
Description : Class, Static, Instance Method
"""
# ํด๋์ค ๋ณ์
price_per_raise = 1.0
def __init__(self, company, details) -> None:
self._company = company
self._details = details
Car.car_count += 1
def __str__(self) -> str:
return f'str : {self._company} - {self._details}'
def __repr__(self) -> str:
return f'repr : {self._company} - {self._details}'
def detail_info(self):
print(f"Current ID : {id(self)}")
print(f"Car Detail Info : {self._company} {self._details.get('price')}")
def __del__(self):
Car.car_count -= 1
Instance Method
def __init__(self, company, details) -> None:
self._company = company
self._details = details
Car.car_count += 1
def __str__(self) -> str:
return f'str : {self._company} - {self._details}'
def __repr__(self) -> str:
return f'repr : {self._company} - {self._details}'
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์์ฑํด์๋ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ธ์คํด์ค ๋ฉ์๋๋ผ๊ณ ํฉ๋๋ค. ์ด ์ธ์คํด์ค ๋ฉ์๋๋ self
์ธ์๋ฅผ ๋ฐ์๋ฐ ์ด๋ ๊ฐ์ฒด์ ๊ณ ์ ํ ์์ฑ๊ฐ์ ์๋ฏธํฉ๋๋ค. ๋๋ฌธ์ ์ธ์คํด์ค๋ง๋ค ๊ณ ์ ํ ๋ฉ์๋์ ๋ฉ์๋ ์์์ ๋ณ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์
๋๋ค.
๋ณ์ ์ ๊ทผ
์๋์ ๊ฐ์ด ์ธ์คํด์ค ๋ณ์์ ๋ํด์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ธ์คํด์ค ๋ณ์๋ฅผ ์ ๊ทผ ํ ๊ฒฝ์ฐ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๊ต์ฅํ ์ทจ์ฝํจ์ผ๋ก ์์คํ ์์์ ์น๋ช ์ ์ธ ๋ฌธ์ ๋ฅผ ์ด๋ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ ๊ทผ ํ๊ณ ์ ํ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์ํ ์ด์์จ์ด๋ผ๊ณ ํด๋ณด์.
car1._details.get('price')
๋๋ฌธ์ ์ธ์คํด์ค ๋ณ์์ ํธ์ถ์ ์ธ์คํด์ค ๋ฉ์๋๋ก ๊ฐ์ธ ์ค์ผ ์ทจ์ฝ์ฑ์ ๊ฐ์ ํ ์ ์๋ค.
def get_price(self):
return f"Before Car price -> company : {self._company} price : { self._details.get('price')}"
๋ํ, ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ธ์คํด์ค ๋ค์ ๊ฐ์ ์ผ๊ด์ ์ผ๋ก ์์ ํ ์ ์๋ค.
print(car1.get_price())
print(car2.get_price())
Car.price_per_raise = 1.4
print(car1.get_price())
print(car2.get_price())
# Before Car price -> company : Ferrari price : 8000
# Before Car price -> company : BMW price : 3000
# Before Car price -> company : Ferrari price : 8000
# Before Car price -> company : BMW price : 3000
Class method(ํด๋์ค ๋ฉ์๋)
ํ์ง๋ง, ์์ ์ด์ผ๊ธฐ ํ๋ฏ์ด ์ธ์คํด์ค์ ๋ณ์๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด ๋งค์ฐ ์ํํ ์ผ ์ธ๊ฒ ์ฒ๋ผ ํด๋์ค ๋ณ์๋ฅผ ์ด๋ ๊ฒ ๋ณ๊ฒฝ ํ๋ ๊ฒ ๋ํ ์ํ ํ ์ผ์ด๋ค. ์ด๋ฅผ ๋งค์๋๋ฅผ ํตํด ๊ตฌํ ํ ์ ์๋ค. ์ฆ, ์ด๋ฒ์๋ ์ธ์คํฐ์ค ๋ฉ์๋๊ฐ ์๋๋ผ ํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ด๋ฅผ ๋ง๋ค์ด ๋ณด์.
ํด๋์ค ๋ฉ์๋๋ @classmethod
๋ฅผ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค ์ ์๋ค. ์ด๋, doc์ ๋ด์ฉ๋ฅผ ์ดํด ๋ณด์
classmethod(function) -> method
Convert a function to be a class method.
A class method receives the class as implicit first argument, just like an instance method receives the instance. To declare a class method, use this idiom:
class C:
@classmethod def f(cls, arg1, arg2, ...):
์ฒซ๋ฒ์งธ ์ธ์๋ก class ๋ฅผ ๋ฐ๋๋ค๊ณ ๋ช
์ํ๊ณ ์๋ค. ์ฆ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด ์ฃผ๋ฉด ๋๋ค.
@classmethod
def raise_price(cls, per):
cls.price_per_raise # = Car.price_per_raise
์ฌ๊ธฐ์ cls
๋ class ์ธ์๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ์ธ์คํด์ค ๋ฉ์๋๊ฐ ์ธ์คํด์ค๋ฅผ self
๋ก ๋ฐ์์ ๊ณ ์ ํ ๊ฐ์ ์ฒ๋ฆฌ ํ ๊ฒ ์ฒ๋ผ, ํด๋์ค ๋ฉ์๋๋ cls
๋ฅผ ๋ฐ์์ ์ด๋ฅผ ๊ณ ์ ํ ํด๋์ค๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋๋ฌธ์ cls.price_per_raise
์ ๊ฐ์ด ์์ฑํ ๊ฒ์ ์์ ์์ฑํ Car.price_per_raise
์ ๊ฐ์ ์๋ฏธ์ด๋ค.
๋ํ, @classmethod
๋ผ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋, ํด๋์ค ๋ฉ์๋๋ ๋ชจ๋ ์ธ์คํด์ค์๊ฒ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ๋งค์ฃผ ์ค์ํ๋ค . ๋๋ฌธ์ ์ฃผ์๋ฅผ ์ง์ค์์ผ ์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ์ดํด์ ๋์์ด ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฝ๋ ์์ฑ์ ์งํ ํ๋ค.
@classmethod
def raise_price(cls, per):
if per <= 1:
print('Please Enter 1 or More')
return
cls.price_per_raise = per
print('Succeed! price increased')
# Before Car price -> company : Ferrari price : 8000.0
# Succeed! price increased
# Before Car price -> company : Ferrari price : 12800.0
Static method (์ ์ ๋ฉ์๋)
ํด๋์ค ๋ฉ์๋์ ๋ฌ๋ฆฌ ์๋ฌด ์ธ์๋ ๋ฐ์ง ์๊ณ , ์ ์ฐํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ ํ ๋ฉ์๋๋ฅผ ์ ์ ๋ฉ์๋๋ผ๊ณ ํ๋ค.
์ฆ, ์ ๋ฆฌ๋ฅผ ํ๋ฉด ์ธ์คํด์ค ๋ฉ์๋๋ self: ์ธ์คํด์ค
๋ฅผ ๋ฐ๊ณ , ํด๋์ค ๋ฉ์๋๋ cls:ํด๋์ค
๋ฅผ ๋ฐ๊ณ , ์ ์ ๋ฉ์๋๋ ์๋ฌด๊ฒ๋ ๋ฐ์ง ์์ต๋๋ค.
ํด๋์ค ๋ฉ์๋์ ๋์ผํ๊ฒ @staticmethod
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํจ์๋ฅผ ์์ฑํ๊ณ , ์ฌ์ฉ ๋ชฉ์ ์ ๋ง๊ฒ ์์๋ก inst: instance
์ธ์๋ฅผ ๋ฐ์ _company
์ ๊ฐ์ด BWM
์ธ์ง ํ์ธ ํ๋ ํจ์๋ฅผ ์์ฑ ํฉ๋๋ค.
@staticmethod
def is_bmw(inst):
if inst._company == 'BMW':
return f'OK! This is {inst._details}'
return 'Sorry. This is car not BMW'
>>> print(car1.is_bmw(car1))
>>> print(car2.is_bmw(car2))
# Sorry. This is car not BMW
# OK! This is {'color': 'Black', 'horsepower': 200, 'price': 3000}
์ ์ ๋ฉ์๋์ ํน์ดํ ์ ์ ์ธ์คํด์ค ์์์ ์คํํ์ง ์๊ณ ํด๋์ค ์์ฒด์์ ์คํ์ด ๊ฐ๋ฅ ํ๋ค๋ ์ ์ ๋๋ค. (์ธ์๋ฅผ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ์๋ ์ข ์ ๋์ง ์์) -> ์ ์ฐ ํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
print(Car.is_bmw(car2))
# OK! This is {'color': 'Black', 'horsepower': 200, 'price': 3000}