프로퍼티 속성

class Test:
    def __init__(self):
        self.public_field =5
        self._private_field = 6
        self._protected_field =7
        
    def __private_method(self):
        pass
    

t=Test()
t
  <__main__.Test at 0x103d337b8>
t.public_field
  5
t._private_field
  6
t._protected_field
  7

class Test2:
    def __init__(self):
        self.color='red'
        
    def set_color(self,clr):
        self.color=clr
        
    def get_color(self):
        return self.color
    

t=Test2()
t
  <__main__.Test2 at 0x103d743c8>
t.color
  'red'
t.set_color("blue")
t.get_color()
  'blue'

@property사용

class Test3:
    
    def __int__(self):
        self.__color="red"
    
    @property
    def color(self):
        return self.__color
    
    @color.setter
    def color(self,clr):
        self.__color= clr
        
t=Test3()
t.color="blue"
t.color
  'blue'


class Celsius:
    def __init__(self, temperature=0):
        self.set_temperature(temperature)

    def to_fahrenheit(self):
        return (self.get_temperature() * 1.8) + 32

    def get_temperature(self):
        return self._temperature

    def set_temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        self._temperature = value


c=Celsius()
c._temperature
  0
c.set_temperature(20)
print(c.get_temperature())
  20

c.set_temperature(-300)
print(c.get_temperature())
  ---------------------------------------------------------------------------
  ValueError                                Traceback (most recent call last)
  <ipython-input-28-7b7da100e252> in <module>()
----> 1 c.set_temperature(-300)
      2 print(c.get_temperature())

  <ipython-input-18-9483d32151d6> in set_temperature(self, value)
     11     def set_temperature(self, value):
     12         if value < -273:
---> 13             raise ValueError("Temperature below -273 is not possible")
     14         self._temperature = value
     15 

  ValueError: Temperature below -273 is not possible
c._temperature=-300
c._temperature
  -300

직접 변수에 접근하면 제한이 적용되지 않음.

# 기존코드
class MovieOld:
    def __init__(self, movie_name):
        self.__movie_name = movie_name
 
    def movie_name(self): # 이때 메서드 이름은 변수(속성)의 이름과 동일하게 하는 것이 좋습니다. 
        return self.__movie_name
 
    def movie_name(self, new_movie_name): # 이때 메서드 이름은 변수(속성)의 이름과 동일하게 하는 것이 좋습니다. 
        """ 영화를 변경하는 setter 메서드"""
        self.__movie_name = new_movie_name
        print("============ setter를 통해 영화를 변경합니다============")
        print('변경 후 영화이름 : {} '.format(self.movie_name))

movie = MovieOld('총알 탄 사나이')
movie.movie_name('j')
  ============ setter를 통해 영화를 변경합니다============
변경 후 영화이름 : <bound method MovieOld.movie_name of <__main__.MovieOld object at 0x103dfa470>> 


class Movie:
    def __init__(self, movie_name):
        self.__movie_name = movie_name
 
    @property
    def movie_name(self): # 이때 메서드 이름은 변수(속성)의 이름과 동일하게 하는 것이 좋습니다. 
        return self.__movie_name
 
    @movie_name.setter
    def movie_name(self, new_movie_name): # 이때 메서드 이름은 변수(속성)의 이름과 동일하게 하는 것이 좋습니다. 
        """ 영화를 변경하는 setter 메서드"""
        self.__movie_name = new_movie_name
        print("============ setter를 통해 영화를 변경합니다============")
        print('변경 후 영화이름 : {} '.format(self.movie_name))


#출처: http://whatisthenext.tistory.com/115 [경영학도의 좌충우돌 프로그래밍]
movie = Movie('총알 탄 사나이')
print(movie.movie_name)
  총알 탄 사나이

movie.movie_name = '히든 피겨스'
  ============ setter를 통해 영화를 변경합니다============
변경 후 영화이름 : 히든 피겨스 


Tags:

Updated:

Leave a Comment