2018-05-24 TIL(Python 클래스)

나만 알기 쉽게 쓴 클래스 이해하기

class fishbread:
	def __init__(self):
		pass

클래스는 붕어빵 찍어내는 틀
붕어빵 형태를 가지는 인스턴스들이 만들어진다
인스턴스를 생성하려면 생성자를 호출해야 한다.

fish_king = fishbread() (생성자 호출을 통한 인스턴스 생성)

마치 붕어빵 틀에 기본적으로 들어가는 밀가루 반죽을 붓는 것처럼 __init__ 생성자 함수(초기화 메서드)를 불러야한다.

property

클래스 캡슐화(encapsulation)를 통해서 데이터나 메서드를 은닉시킬 수 있는데 파이썬에서는 어떻게든 접근을 할 수 있다. 그 접근을 어렵게만 만들 뿐 마음만 먹으면 맘대로 접근하여 데이터를 조작할 수 있다. 왜냐하면 네임 맹글링 기법을 사용하기 떄문이다.

프로퍼티는 해당 메서드를 읽기 전용으로 만드는 기능이다. 따라서 return으로 반환되어야 하고 속성처럼 메서드에 접근할 수 있도록 만들어준다.

@property는 getter 역할을 하고 @something.setter는 setter역할을 한다.

프로퍼티를 사용하는 목적은 간단하게

  1. 변수를 변경할 때 제한을 두려고
  2. get, set함수를 만들지 않고 더 간단하게 접근하려고

그 밖에 이유가 여러가지 있다고 한다.

참고로 홑밑줄과 곁밑줄의 차이

홑밑줄(single underscore) : 보통 내부적으로 사용하는 변수일 때 사용합니다.

곁밑줄(double underscore) : 클래스 외부에서 접근할 수 없도록 내부 변수로 만듭니다.

클래스 실습

11-1.

이름, 체중 그리고 체력을 입력받는 Human클래스 생성

routine 메소드를 통해 식사 또는 운동을 함

class Human:
    def __init__(self, name, weight, strength):
        self.name = name
        self.weight = weight
        self.strength = strength
        
    def routine(self, action):
        action.act(self)

식사와 운동 클래스

class Eat:
    def act(self, human):
        human.weight += 0.5
        human.strength += 0.2

class Workout:
    def act(self, human):
        human.weight -= 0.3
        human.strength += 0.7
>>> pch = Human('박찬혁', 80, 25)
>>> breakfast = Eat()
>>> crossfit = Workout()
>>> pch.routine(breakfast)
>>> print(pch.weight, pch.strength)
>>> 80.5 25.2
>>> pch.routine(crossfit)
>>> print(pch.weight, pch.strength)
>>> 80.2 25.7

11.2

class Human:
    def __init__(self, name, weight, strength):
        self.name = name
        self.weight = weight
        self.__strength = strength
        
    def routine(self, action):
        action.act(self)
     
    @property
    def strength_point(self, strength):
        return self.__strength
    
    @strength_point.setter
    def strength_point(self, strength):
        if strength <= 100:
            self.__strength = strength
        else:
            print('strength는 100을 초과할 수 없습니다.')

Comments