반응형

2020/07/04 - [Coder/Python] - [python] 클래스와 메서드 1. 클래스 사용의 장점

 

[python] 클래스와 메소드 1. 클래스 사용의 장점

1. 객체 지향 프로그래밍 (OOP) 규모가 큰 프로젝트 즉 프로그램을 가정할 떄 함수중심 데이터양이 많아 코드의 중복, 재사용이 발생 협업 시 휴먼에러 발생 가능성이 큼 클래스 중심 = 데이터 중��

leo-bb.tistory.com

class Icecream():
    """
    Icecream class
    author : london
    date 2020-07-02
    description : class, static, instance method
    """

    # 클래스 변수(모든 인스턴스가 공유)
    icecream_cnt = 0
    icecream_price_rate = 1.0

    def __init__(self, name, detail):
        self._name = name
        self._detail = detail

    def __str__(self) :
        return 'str : {} - {}'.format(self._name, self._detail)
    #비공식적으로 사용자 레벨의 출력을 원할 경우 사용하는 메소드(반복문 등에서 호출됨)

    def __repr__(self) :
        return 'repr : {} - {}'.format(self._name, self._detail)
    #공식적으로 개발자 레벨의 출력을 원할 경우 사용하는 메소드(객체정보까지 표시해준다.)

    def __del__(self):
        Icecream.icecream_cnt -= 1

    # instance method --> self를 통해 연산, 즉 객체의 고유한 속성 값을 사용하는 메소드
    def detail_info(self):
        print('current ID : {}'.format(id(self)))
        print('current Name : {}'.format(self._name))

    def get_price(self) :
        return 'before icecream price => name : {}, prcie : {}'.format(self._name, self._detail.get('price'))

    def get_price_after(self):
        return 'after icecream price => name : {}, prcie : {}'.format(self._name, self._detail.get('price')*Icecream.icecream_price_rate)

    # class method 
    @classmethod
    def raise_price(cls, per):
        if per <= 1 :
            print('enter more then 1')
            return
        cls.icecream_rev = per

    @classmethod
    def discount_price(cls, per):
        if per >= 1 :
            print('enter less then 1')
            return
        cls.icecream_rev = per

    #static method
    @staticmethod
    def how_favorite(inst):
        print('this icecream favorite rank is {}'.format(inst._detail.get('favorite')))

1. self의 의미

클래스 내에서 개별적인 "고유한" 인스턴스 값을 만드는 지시어

print(id(icecream1))
print(id(icecream2))
print(id(icecream1.__class__), id(icecream2.__class__))
>>>4332120464
>>>4332120592
>>>140428835871616 140428835871616
# iceream1, 2 는 서로 다른 id를 갖지만 각 아이스크림이 생성된 클래스는 동일하기 때문에 동일한 아이디를 갖는다.

print(icecream1 is icecream2) 
print(icecream1.name == iceream2.name)
>>>false
>>>false
# 따라서 두 아이스크림의 객체와 각 인스턴스 변수도 서로 다르다

print(icecream1.icecream_cnt)
>>>2
# 모든 인스턴스 객체가 공유하는 클래스 변수는 두개의 객체를 생성했기 때문에 2가 나오는 모습을 볼 수 있다.

동일한 이름으로 변수 선언가능하며 자동으로 상위로 검색을 수행합니다.
* 순서 : 인스턴스 내에서 검색 후(self) -> 클래스 변수/부모 클래스 변수에서 검색

2. Method

클래스 내부 함수로 생각하면 쉽다. 일반적으로 객체의 인스턴스 변수에 사용자가 직접 접근하는 것은 프로그램의 안전과 보안에 치명적인 오류를 발생시킬 수 있기 때문에 프로그램 작동 시 사용자가 여러 변수들을 조정할 필요가 있는 경우 제한적으로 해당 기능을 수행하는 메서드를 만들어 제공합니다.

 

1. instance method

self 를 인자로 받는 모든 메서드로 각 객체의 인스턴스 변수에 접근하고 제어하는 역할을 수행합니다.

  • 여기서 인스턴스는 객체를 의미합니다.(일반적으로 객체만 지칭하면 object 클래스와 연관해서 지칭할 땐 instance로 지칭합니다.

2. class method

메소드 밖에 존재하는 변수 즉 클래스 변수는 클래스로 생성되는 모든 인스턴스에 공통으로 사용되는 변수인데, 이러한 클래스 변수에 접근, 제어하는 기능을 수행합니다.

  • @classmethod 라는 데코레이터를 쓰고 인자로 self가 아닌 cls(class) 를 받는다.

3. static method

self 파라미터를 갖지 않는 특징을 갖습니다.(따라서 인스턴스 변수에 접근하지 못합니다.) 정적 메서드는 커뮤니티에서도 굳이 사용할 필요가 있느냐 없느냐로 종종 논란이 되기도 하는데 보통 객체랑은 완전히 독립적이지만 전체 로직상 필요한 경우에 사용하게 됩니다.

  •  즉 인스턴스 변수나 클래스 변수에 접근할 필요는 없는데 기능상 꼭 사용하게 되는 경우 작성한다고 생각하면 되고 @staticmethod 데코레이터를 붙여줍니다.

참고 1. "우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)"
참고 2. 예제로 배우는 파이썬 프로그래밍

반응형
복사했습니다!