When will you grow up?

(class, instance, static) method_03 본문

02. Study/Python

(class, instance, static) method_03

미카이 2022. 3. 21. 14:48

이번시간에는 class, instance, static 메소드에 대해 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Car(object): # 모든 클래스는 object를 상속받는다.
    """ # 파이써닉 규칙 (description)
    Car class
    Author: Mekai
    Data: 2021.03.21
    Description : Class, Static, Instance Method 
    """
    # 클래스 변수(모든 인스턴스가 공유)
    price_per_raise = 1.0
 
    def __init__(self, company, details):
        self._company = company
        self._details = details
        
    def __str__(self):
        return 'str : {} - {}'.format(self._company, self._details)
 
    def __repr__(self):
        return 'repr: {} - {}'.format(self._company, self._details)
 
    # Instance Method
    # self : 객체의 고유한 속성 값을 사용
    def detail_info(self): # self 매개변수로 받는것을 인스턴스 메소드(instance method)라고 한다
        print('Current ID : {}'.format(id(self)))
        print('Car Detail Info : {} {}'.format(self._company, self._details.get('price')))
    # Instance Method
    def get_price(self):
        return 'Before Car Price -> company : {}, price : {}'.format(self._company, self._details.get('price'))
    # Instance Method
    def get_price_culc(self):
        return 'After Car Price -> company : {}, price : {}'.format(self._company, self._details.get('price')* Car.price_per_raise)
 
 
    # class Method
    # instance method는 self를 인자값으로 받고, classmethod 는 cls는 인자로 받는다
    @classmethod # 명시적으로 쓰기 위해 데코레이터가 달려있다!
    def raise_price(cls, per): # cls는 객체 Car다.. 명시적으로 쓰는것!
        if per <= 1:
            print('Plaease Enter 1 or More')
            return
        else:
            cls.price_per_raise = per
            print('Succeed!')
 
    
    # static method는 아무것도 전달받지 않는다/ instance method는 self / classmethod는 cls 객체를
    # static method 없어도 cls로 다 할 수 있다는 의견들이 많다.. 인터넷 찾아보면 ~_~
    # 아무것도 받지 않기 때문에 유연하긴하다.. 공통적으로 만들때 쓰는것
    @staticmethod
    def is_bmw(inst): # bmw 차가 맞는지 판단하는..
        if inst._company =='Bmw':
            return 'OK! This car is {}'.format(inst._company)
        else:
            return 'Sorry. This car is not Bmw.'
    
 
 
car1 = Car('Ferrari', {'color''White''horsepower'400'price'8000})
car2 = Car('Bmw', {'color''Black''horsepower'270'price'5000})
cs

자동차 2개 객체를 추가하여 위 클래스 기반으로 알아보도록 하자.

 

 

@classmethod

클래스 메소드는 cls를 인자값 받으며 명시적으로 쓰기 위해 @ (데코레이터)가 달려있다.

자기 자신을 의미하기 때문에 일반적으로 클래스 변수에 접근하기 위해 사용된다.

 

def detail_info(self):

인스턴스 메소드는 객체의 고유한 값을 가지고 self로 메소드를 만들고,

객체의 인스턴스 필드를 self를 통해 접근가능하다.

 

@staticmethod

스태틱 메소드는 아무것도 전달 받지 않기 때문에 유연하게 메소드를 만들 수 있고 공통적으로 무언가 만들때 자주 사용된다.

하지만 cls로 다 할 수 있다는 의견들이 많은데 인터넷 검색해보면 나온다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 전체정보 출력
car1.detail_info()
car2.detail_info()
 
# 가격정보 (직접 접근)
print(car1._details.get('price')) # 이렇게 접근할 수 있지만, 자기 인스턴스 변수에 직접 접근하는 방법은 좋지 않다. 막아놓는다.
print(car2._details['price']) # 이렇게 접근할 수 있지만, 자기 인스턴스 변수에 직접 접근하는 방법은 좋지 않다. 막아놓는다.
 
 
# 가격정보(인상 전->인스턴스 메소드 접근)
print(car1.get_price())
print(car2.get_price())
 
# 가격 인상
Car.price_per_raise = 1.4 # 사실 이렇게 직접 접근하는 방식은 좋지 않다.
# 가격정보(인상 후->인스턴스 메소드 접근)
print(car1.get_price_culc())
print(car2.get_price_culc())
 
 
# 가격 인상(클래스 메소드 사용)
Car.raise_price(1.6)
 
print(car1.get_price_culc())
print(car2.get_price_culc())
 
 
 
# Staticmethod
# 아래처럼 호출할 수 있지만 엄청나게 유연하다!
print(car1.is_bmw(car1))# 인스턴스로 호출
print(car2.is_bmw(car2))
# 이렇게 유연하게 호출도 가능.
print(Car.is_bmw(car1)) # 클래스로 호출
print(Car.is_bmw(car2))
cs

 

간단정리하면 static method는 아무것도 전달받지 않고, instance method는 self, classmethod는 cls 객체를 전달 받는다.

 

우리를 위한 프로그래밍 : 파이썬 중급 를 기반으로 정리하였으며,

기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.

Comments