3-3. Property(getter, setter)

uoayopΒ·2021λ…„ 3μ›” 20일
0

Leaf와 Python

λͺ©λ‘ 보기
12/21
post-thumbnail

μ§€λ‚œ κ°•μ˜μ—μ„œ 배웠듯이 파이썬의 클래슀 κ΄€μ μ—μ„œ μ–Έλ”μŠ€μ½”μ–΄(_)κ°€ λ‘κ°œ λΆ™μ–΄μžˆμœΌλ©΄ privateν•œ λ³€μˆ˜λ‹€.

privateν•œ λ³€μˆ˜μ— λŒ€ν•΄μ„œ λ‚΄λΆ€μ˜ ν‘œν˜„μ„ 숨기고 μ™ΈλΆ€μ—μ„œ λ“€μ–΄λ‚˜κ²Œ ν• λ•Œ(μΊ‘μŠν™”), ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μ½κ±°λ‚˜ μˆ˜μ •ν•˜λ €λ©΄ λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•΄μ•Όν•œλ‹€.

κ·ΈλŸΌμ—λ„ 직접 μ ‘κ·Όν•  수 μžˆλŠ” 방법은 μžˆκΈ°μ— @Property annotation이 μ‘΄μž¬ν•œλ‹€.
μ§€λ‚œ μ‹œκ°„μ— 짰던 λ³΅μž‘ν•œ μ½”λ“œλ₯Ό λ”μš± κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 있게 λœλ‹€.

Property

  • 였늘의 ν‚€μ›Œλ“œ
    • Pythonic Code, @Property, Getter /Setter

@Property λ₯Ό μ™œ μ‚¬μš©ν•˜λ‚˜μš”?

1. pythonicν•œ μ½”λ“œλ‘œ μž‘μ„±κ°€λŠ₯ν•˜λ‹€.

λ‹€λ₯Έ 언어와 μ°¨λ³„λ˜κ²Œ κ°„λ‹¨ν•œ 문법이 파이썬의 독보적인 μž₯점이닀.
이λ₯Ό ν™œμš©ν•˜λŠ” 것이 νŒŒμ΄μ¬μ„ μ œλŒ€λ‘œ μ΄μš©ν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€.

2. λ³€μˆ˜μ— μ œμ•½μ„ μ„€μ •ν•  수 μžˆλ‹€.

(ex) μ˜μ–΄λ§Œ ν• λ‹Ήν•  λ³€μˆ˜ , 숫자만 받을 λ³€μˆ˜

  • μ˜λ„ν•œ λŒ€λ‘œ ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•  수 μžˆλ„λ‘ ν•΄μ„œ 쑰금 더 κ²¬κ³ ν•˜κ²Œ λ™μž‘κ°€λŠ₯ν•˜λ‹€.

3. getter, setter νš¨κ³Όκ°€ λ™λ“±ν•˜λ‹€.

  • μ½”λ“œμ— 일관성이 생긴닀.
  • μΊ‘μŠν™”, μœ νš¨μ„± 검사, κΈ°λŠ₯ μΆ”κ°€ 용이
    • 속성 λ…ΈμΆœ, λ‚΄λΆ€ ν‘œν˜„ 숨기기 κ°€λŠ₯
  • ⭐️ (κ°€μž₯ μ€‘μš”) μ†μ„±μ˜ 수λͺ… 및 λ©”λͺ¨λ¦¬ 관리 용이
    • 클래슀의 레퍼런슀 μ£Όμ†Œλ§Œ 없어지면, λ³€μˆ˜λ“€μ΄ μ•Œμ•„μ„œ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ 사라짐
  • 디버깅 용이
  • getter,setterλ₯Ό μ‚¬μš©ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λ§Žλ‹€.
    λ”°λΌμ„œ μƒν˜Έμš΄μš©μ„±μ΄ 쒋아진닀. (django 같은 μ˜€ν”ˆμ†ŒμŠ€)

@Property μ‚¬μš©ν•˜κΈ°

  • κΈ°μ‘΄ μ½”λ“œλŠ” private ν•œ λ³€μˆ˜κ°€ μ—¬λŸ¬κ°œ 이면 getter, setter 의 개수λ₯Ό μ—¬λŸ¬κ°œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. - λ„˜λ‚˜ λΉ„νš¨μœ¨μ 
class SampleB:
    def __init__(self):
        self.x = 0
        self.__y = 0
    
    def get_y(self):
        return self.__y

    def set_y(self,value):
        self.__y = value
  • μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μ½”λ“œλ₯Ό 더 μ‰½κ²Œ μž‘μ„±ν•  수 μžˆλ‹€!
    μ–Έλ”μŠ€μ½”μ–΄λ₯Ό μ œμ™Έν•œ λ³€μˆ˜ μ΄λ¦„μœΌλ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.
class SampleA:
    def __init__(self):
        self.x = 0
        self.__y = 0 #private
    
    # λ”°λ‘œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ μ•Œμ•„μ„œ ν•„μš”ν•œ μ‹œμ μ— λ™μž‘ν•œλ‹€.
    @property
    def y(self):
        print('Called get method.')
        return self.__y

    @y.setter
    def y(self,value):
        print('Called set method.')
        self.__y = value
    
    @y.deleter
    def y(self):
        print('Called delete method.')
        del self.__y


a = SampleA()
a.x = 1
a.y = 2 # setterκ°€ λ™μž‘ν•œλ‹€.

print('ex 1> x : {}'.format(a.x))
print('ex 1> y : {}'.format(a.y)) # getter λ™μž‘

# deleter
del a.y
  • dir둜 deleter 둜 λ³€μˆ˜λ₯Ό μ§€μš°κΈ° μ „κ³Ό ν›„μ˜ 객체λ₯Ό ν™•μΈν•΄λ³΄μž
print('ex 1> dir : {}'.format(dir(a)))
#[ _SampleA__y , ... , 'x', 'y']

del a.y

print('ex 1> dir : {}'.format(dir(a)))
# [ ... , 'x', 'y']

@property 둜 λ³€μˆ˜μ— μ œμ•½ 쑰건 μΆ”κ°€

  • private λ³€μˆ˜ y에 0보닀 큰 κ°’λ§Œ λ“€μ–΄μ˜€κ²Œ 쑰건을 μΆ”κ°€ν•˜λ €κ³  ν•œλ‹€.
  • setter에 쑰건문을 μΆ”κ°€ν•΄μ„œ, 0보닀 μž‘μ€ 값이 λ“€μ–΄μ˜€λ©΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λ©΄ λœλ‹€.

class SampleB:
    def __init__(self):
        self.x = 0
        self.__y = 0 #private
    
    @property
    def y(self):
        return self.__y

    @y.setter
    def y(self,value):
        if value < 0:
            raise ValueError('0 보닀 큰 값을 μž…λ ₯ν•˜μ„Έμš”')
        self.__y = value
    
    @y.deleter
    def y(self):
        del self.__y

b = SampleB()
b.x = 1
b.y = 10

print('ex 2> x : {}'.format(b.x))
print('ex 2> y : {}'.format(b.y))


b.y = -5
#μ˜ˆμ™Έ λ°œμƒ ValueError: 0 보닀 큰 값을 μž…λ ₯ν•˜μ„Έμš”

정리

private λ³€μˆ˜ : __IamPrivate

#getter
@property
def IamPrivate(self):
    return self.__IamPrivate
#setter
@IamPrivate.setter
def IamPrivate(self,value):
    if [value μ œμ•½ 쑰건]:
        (μ—λŸ¬ 처리)
    self.__IamPrivate = value  
#deleter for memory
@IamPrivate.deleter
def IamPrivate(self):
    del self.__IamPrivate

좜처: μΈν”„λŸ° - λͺ¨λ‘λ₯Ό μœ„ν•œ 파이썬 : ν•„μˆ˜ 문법 배우기 Feat. μ˜€ν”ˆμ†ŒμŠ€ νŒ¨ν‚€μ§€ 배포 (Inflearn Original)

profile
slow and steady wins the race 🐒

0개의 λŒ“κΈ€