ํจ์์ธ๋ฐ ๋ณ์์ฒ๋ผ ์ฐ๋ ๊ฒ
๋ด๋ถ์ ๊ณ์ฐ์ด๋ ๊ฒ์ฆ ๋ก์ง์ ํฌํจ์ํค๊ณ ์ถ์ง๋ง, ์ธ๋ถ์์๋ ์ด๋ฅผ ๊ทธ์ ๋จ์ํ attribute์ฒ๋ผ ์ฌ์ฉํ๊ฒ ๋ง๋ค๊ณ ์ถ์ ๋ property๋ฅผ ์ฌ์ฉํ๋ค.
c.f. ๋จ์ผ ์ ๊ทผ ์์น(Uniform Access Principle) : ๋ด๋ถ ๋ก์ง์ด ๋จ์ํ ๋ณ์์ธ์ง, ๋ณต์กํ ํจ์ ๊ณ์ฐ์ธ์ง ์ฌ์ฉ์๋ ์ ํ์ ์์ด ๋๊ฐ์ด ์ ๊ทผํ ์ ์์ด์ผ ํ๋ค๋ ๊ฐ๋ .
class Person:
def __init__(self):
self._age = 20
@property
def age(self):
return self._age
p = Person()
print(p.age)
์ค์ ๋ก๋ ๋ฉ์๋์ด์ง๋ง attribute์ฒ๋ผ ์ ๊ทผ ๊ฐ๋ฅ
๋ด๋ถ์ ๋ก์ง์ ๋ฃ์ ์ ์๋ค.
ํ์ฉ ์์
1. ๋ฐ์ดํฐ ๊ฒ์ฆ(Validation)
class Person:
def __init__(self):
self._age = 20
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("๋์ด๋ ์์ ๋ถ๊ฐ")
self._age = value
p = Person()
p.age = 10 # setter ์คํ๋จ
class User:
def __init__(self, name, age):
self.name = name
self.age = age # ์ฌ๊ธฐ์ ์์ฐ์ค๋ฝ๊ฒ setter๊ฐ ํธ์ถ๋ฉ๋๋ค!
# 1. Getter: ๊ฐ์ ์ฝ์ ๋ ์คํ๋๋ ํจ์
@property
def age(self):
return self._age
# 2. Setter: ๊ฐ์ ํ ๋นํ ๋ ์คํ๋๋ ํจ์
@age.setter
def age(self, value):
if value < 0:
raise ValueError("๋์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค!")
self._age = value
# ์ฌ์ฉ ์์
user1 = User("ํ์ด์ฌ", 20)
print(user1.age) # ์ถ๋ ฅ: 20 (๋ณ์์ฒ๋ผ ์ ๊ทผ)
# ๋ฐ์ดํฐ ๊ฒ์ฆ ํ
์คํธ
try:
user1.age = -5 # ๋ณ์์ฒ๋ผ ๊ฐ์ ๋ฃ์ง๋ง, ๋ด๋ถ์ ์ผ๋ก๋ ํจ์๊ฐ ์คํ๋์ด ์๋ฌ๋ฅผ ๋ฐ์์ํด!
except ValueError as e:
print(f"์๋ฌ ๋ฐ์: {e}")
2. ๋์ ๊ณ์ฐ (Computed Properties)
e.g. first_name๊ณผ last_name์ด๋ผ๋ ๋ณ์๋ง ์ ์ฅํด ๋๊ณ , full_name์ ํธ์ถํ ๋๋ง๋ค ๋ ๊ฐ๋ฅผ ํฉ์ณ์ ๋ฐํํ๊ฒ ๋ง๋ค๊ธฐ. (๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ)
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
# ๋ณ๋์ ๋ณ์๋ก ์ ์ฅํ์ง ์๊ณ , ํธ์ถ๋ ๋๋ง๋ค ๊ณ์ฐํด์ ๋ฐํ!
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
# ์ฌ์ฉ ์์
person = Person("๊ธธ๋", "ํ")
# 1. ํจ์ํํ์ธ full_name()์ด ์๋๋ผ ๋ณ์์ฒ๋ผ full_name ์ผ๋ก ํธ์ถ
print(person.full_name) # ์ถ๋ ฅ: ๊ธธ๋ ํ
# 2. ์ด๋ฆ์ด ๋ฐ๋๋ฉด?
person.first_name = "์ฒ ์"
# 3. full_name๋ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค!
print(person.full_name) # ์ถ๋ ฅ: ์ฒ ์ ํ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ตณ์ด ์ ์ฅํ ํ์ ์๋ ๊ฐ๋ค์, ํธ์ถํ๋ ์๊ฐ์ ๊ณ์ฐํด์ ๋์ ธ์ฃผ๋ ํจํด์ด๋ค.
full_name ์ด๋ผ๋ ๋ณ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ์ ์ฅํด๋๋ฉด, first_name์ด ๋ฐ๋ ๋๋ง๋ค full_name๋ ์ ๋ฐ์ดํธํด ์ค์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์๊ณผ ๋ฒ๊ทธ์ ์ํ์ด ์๊ธด๋ค. ํ์ง๋ง @property๋ฅผ ์ฐ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ ์๋ผ๊ณ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๋ ์งํฌ ์ ์๋ค.
๋ํ, ์ด ์์ ์์๋ setter๋ฅผ ๊ตฌํํ์ง ์์๊ธฐ ๋๋ฌธ์ person.full_name = "๊น์ฒ ์" ์ฒ๋ผ ๊ฐ์ ๋ก ๊ฐ์ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด AttributeError๊ฐ ๋ฐ์ํ๋ฉฐ ์ฝ๊ธฐ ์ ์ฉ(Read-only) ์์ฑ์ด ๋๋ค.