속성

Python의 객체 지향 프로그래밍

Alex Yarosh

Content Quality Analyst @ DataCamp

속성 값 변경하기

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# Use dot syntax and = to alter atributes
emp.salary = emp.salary + 5000
Python의 객체 지향 프로그래밍

속성 값 변경하기

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# Use dot syntax and = to alter atributes
emp.salary = emp.salary + 5000

 

 

속성 접근 제어가 필요할 때?

  • 값의 유효성 검사
  • 속성을 읽기 전용으로 설정
    • set_salary()만 바꿔도 emp.salary = -100은 막지 못함
Python의 객체 지향 프로그래밍

제한 및 읽기 전용 속성

import pandas as pd
df = pd.DataFrame({"colA": [1,2], "colB":[3,4]})
df
  colA colB
0    1    3
1    2    4
df.columns = ["new_colA", "new_colB"]
df
  new_colA  new_colB
0    1    3
1    2    4
# will cause an error
df.columns = ["new_colA", "new_colB", "extra"]
df
ValueError: Length mismatch: 
Expected axis has 2 elements, 
new values have 3 elements
df.shape = (43, 27)
df
AttributeError: can't set attribute
Python의 객체 지향 프로그래밍

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary):
if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary

 

← 데이터 저장에는 선행 _가 있는 "보호된" 속성 사용

← 제한할 속성과 같은 이름의 메서드@property 사용; 내부 속성 반환

obj.attr = value 시 호출될 메서드 attr()@attr.setter 사용

  • 할당할 값이 인수로 전달됨
Python의 객체 지향 프로그래밍

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary): if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary
emp = Employee("Miriam Azari", 35000)
# accessing the "property"
emp.salary
35000
emp.salary = 60000 # <-- @salary.setter
emp.salary = -1000
ValueError: Invalid salary
Python의 객체 지향 프로그래밍

@property를 쓰는 이유

  $$\text{\Large{사용자 관점: 속성처럼 동작}}$$

 

$$\text{\Large{개발자 관점: 접근 제어 제공}}$$

Python의 객체 지향 프로그래밍

기타 가능성

@attr.setter를 추가하지 마세요

읽기 전용 속성 만들기

@attr.getter 추가

속성의 값을 조회할 때 호출되는 메서드에 사용

@attr.deleter 추가

속성을 del삭제할 때 호출되는 메서드에 사용

Python의 객체 지향 프로그래밍

연습해 봅시다!

Python의 객체 지향 프로그래밍

Preparing Video For Download...