- ์ฌ์ฌ์ฉ์ฑ ๋จ์ด์ง
@property๊ฐ ๋ฐ์ฝ๋ ์ด์ ํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ ํด๋์ค์ ์ํ๋ ์ฌ๋ฌ ์ ํธ๋ฆฌ๋ทฐํธ๋ก ์ฌ์ฉ ๋ถ๊ฐ
class Homework:
def __init__(self):
self._grade = 0
@property
def grade(self):
return self._grade
@grade.setter
def grade(self, value):
if not (0 <= value <= 100):
raise ValueError('์ ์๋ 0๊ณผ 100 ์ฌ์ด์
๋๋ค')
self._grade = value
galileo = Homework()
galileo.grade = 95class Exam:
def __init__(self):
self._writing_grade = 0
self._math_grade = 0
@staticmethod
def _check_grade(value):
if not (0 <= value <= 100):
raise ValueError('์ ์๋ 0๊ณผ 100 ์ฌ์ด์
๋๋ค')
@property
def writing_grade(self):
return self._writing_grade
@writing_grade.setter
def writing_grade(self, value):
self._check_grade(value)
self._writing_grade = value
@property
def math_grade(self):
return self._math_grade
@math_grade.setter
def math_grade(self, value):
self._check_grade(value)
self._math_grade = valueExamํด๋์ค์ ๊ฐ์ด ๊ณ์ ํ์ฅํ๋ค๋ณด๋ฉด ์ํ ๊ณผ๋ชฉ์ ์ด๋ฃจ๋ ๊ฐ ๋ถ๋ถ๋ง๋ค ์๋ก์ด@property๋ฅผ ์ง์ ํ๊ณ ๊ด๋ จ ๊ฒ์ฆ ๋ฉ์๋๋ฅผ ์์ฑํด์ผ ํจ- ์์ ๋ ์ํ ์ฑ์ ์ด์ธ์ ๋ถ๋ถ์ ๋ฐฑ๋ถ์จ ๊ฒ์ฆ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋๊ฐ์ด
๊ฒ์ฆ๋์_grade์ ๋ํ setter ๋ฉ์๋๋ฅผ ๋ค์ ๋ง๋ค์ด์ผ ํจ
- ๋์คํฌ๋ฆฝํฐ ํ๋กํ ์ฝ์ ํ์ด์ ์ธ์ด์์ ์ ํธ๋ฆฌ๋ทฐํธ ์ ๊ทผ์ ํด์ํ๋ ๋ฐฉ๋ฒ์ ์ ์
- ๋์คํฌ๋ฆฝํฐ ํด๋์ค๋
__get__,__set__๋ฉ์๋ ์ ๊ณต - ๊ฐ์ ๋ก์ง์ ํ ํด๋์ค ์์ ์ํ ์ฌ๋ฌ ๋ค๋ฅธ ์ ํธ๋ฆฌ๋ทฐํธ์ ์ ์ฉ ๊ฐ๋ฅ
- ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ฏน์ค์ธ ๋ณด๋ค ๋์
class Grade:
def __get__(self, instance, instance_type):
...
def __set__(self, instance, value):
...
class Exam:
# ํด๋์ค ์ ํธ๋ฆฌ๋ทฐํธ
math_grade = Grade()
writing_grade = Grade()
science_grade = Grade()
exam = Exam()
exam.writing_grade = 40exam.writing_grade์ 40 ์ ๋์ ํ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํด์๋จ
Exam.__dict__['writing_grade'].__set__(exam, 40)exam.writing_grade๋ฅผ ์ฝ๊ฒ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํด์๋จ
Exam.__dict__['writing_grade'].__get__(exam, Exam)-
ํด๋น ๋์์ object ์
__getattribute__๋ฉ์๋Exam์ธ์คํด์ค์writing_grade์ด๋ฆ์ ์ ํธ๋ฆฌ๋ทฐํธ๊ฐ ์์ผ๋ฉด python ์์Examํด๋์ค์ ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋์ ์ฌ์ฉ- ํด๋์ค์ ์ ํธ๋ฆฌ๋ทฐํธ๊ฐ
__get__,__set__๋ฉ์๋๊ฐ ์ ์๋ ๊ฐ์ฒด๋ผ๋ฉด python ์ ๋์คํฌ๋ฆฝํฐ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋๋ก ๊ฒฐ์ ํจ
-
ํ์ฌ ๊ตฌํ์ ๋ชจ๋
Exam์ธ์คํด์ค๊ฐ ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ณต์ ํ์ฌ ๊ด๋ฆฌ์ ๋ถํธ, ์๋์ ๊ฐ์ด ์์
class Grade:
def __init__(self):
self._values = {}
def __get__(self, instance, instance_type):
if instance is None:
return self
return self._values.get(instance, 0)
def __set__(self, instance, value):
if not (0 <= value <= 100):
raise ValueError('์ ์๋ 0๊ณผ 100 ์ฌ์ด์
๋๋ค')
self._values[instance] = value-
__set__๋ฉ์๋์์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ๋ชจ๋Exam์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ_value๊ฐ ์ ์ฅ -
๋ฌธ์
- ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ ์นด์ดํฐ๊ฐ ์ ๋๋ก 0์ด ๋ ์ ์์
- garbage collector๊ฐ ์ธ์คํด์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ์ฉํ์ง ๋ชปํจ
- ๋์ ๋ฐ์
-
ํด๊ฒฐ๋ฐฉ์
weakref๋ด์ฅ ๋ชจ๋ ์ฌ์ฉWeakKeyDictionaryํด๋์ค ์ ๊ณต,_value์ ์ฌ์ฉํ๋๋ก ์์ - ๋์ ๋๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋ ์ฝํ ์ฐธ์กฐ(weak reference)๋ฅผ ์ฌ์ฉํจ
- garbage collector ๋ ์ฝํ ์ฐธ์กฐ๋ก๋ง ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ์ฉํ ์ ์์
WeakKeyDictionary์ ์ ์ฅ๋Exam์ธ์คํด์ค๊ฐ ๋ ์ด์ ์ฐ์ด์ง ์์ผ๋ฉด garbage collector ๊ฐ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฌํ์ฉ ๊ฐ๋ฅ
from weakref import WeakKeyDictionary
class Grade:
def __init__(self):
self._values = WeakKeyDictionary()
def __get__(self, instance, instance_type):
...
def __set__(self, instance, value):
...
class Exam:
math_grade = Grade()
writing_grade = Grade()
science_grade = Grade()
first_exam = Exam()
first_exam.writing_grade = 82
second_exam = Exam()
second_exam.writing_grade = 75
print(f'์ฒซ ๋ฒ์งธ ์ฐ๊ธฐ ์ ์ {first_exam.writing_grade} ๋ง์')
print(f'๋ ๋ฒ์งธ ์ฐ๊ธฐ ์ ์ {second_exam.writing_grade} ๋ง์')
>>>
์ฒซ ๋ฒ์งธ ์ฐ๊ธฐ ์ ์ 82 ๋ง์
๋ ๋ฒ์งธ ์ฐ๊ธฐ ์ ์ 75 ๋ง์