중급_문법

파이썬 클래스

나도초딩 2023. 4. 9.

 

메서드의 첫 번째 매개변수는 반드시 self를 지정해야 한다.

메서드에서 인스턴스 접근시, 매개변수 self 를 반드시 붙여야한다.

 

class Test:
    def test1(self):
    	a = 'hello'

 

여기서 self는 java의 this와 똑같다.

 

생성자

class Person:
    def __init__(self):
        self.hello = '안녕하세요'


    def greeting(self):
        print(self.hello)

james = Person()
james.greeting()

>>> 안녕하세요

 

 

__init(self)는 파이썬의 생성자다.

파이썬을 불러올 때 가장 먼저 들리는 메서드다. 그래서 hello안에 '안녕하세요'가 저장 될 수가 있다.

greeting(self)는 메서드다. 기존 greeting()처럼 james.greeting()로 사용해서 불러올 수가 있다.

 

 

 

비공개 속성 사용하기

class Person:
    def __init__(self, name, age, address, wallet):
        self.name = name
        self.age = age
        self.address = address
        self.__wallet = wallet

    def pay(self, amount):
        if amount > self.__wallet:
            return

        self.__wallet -= amount
        print('이제 {0}원 남았네요.'.format(self.__wallet))
        

maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.pay(3000)

 변수명 앞에 __변수명을 지정하게 되면 외부에서의 접근을 할 수 없게 된다.

그래서 메서드를 이용해서 접근을 하도록 해야 한다.

 

Class를 생성하고 나서 사용 할 때.

 

class Person:
    bag = []

    
    def put_bag(self, stuff):
        self.bag.append(stuff)

james = Person()
james.put_bag('책')


maria = Person()
maria.put_bag('열쇠')

print(james.bag)
print(maria.bag)

>>>['책', '열쇠']

>>>['책', '열쇠']

 

 

클래스 속성은 클래스에 속해 있으면 모든 인스턴스에서 공유한다. 그래서 클래스 속성에 접근 할 때 명칭은

self를 사용하기엔 좀 아쉽다.

 

class Person:
	bag = []
    
    def put_bag(self, stuff):
    	Person.bag.append(stuff)

Person.bag 라고 하니 클래스 Person에 속한 bag 속성이라는 것을 바로 알 수 있다.

마찬가지로 클래스 바깥에서도 다음과 같이 클래스 이름으로 클래스 속성에 접근하면 된다.

 

이는 어차피 bag는 공유의 성질을 갖고 있어서 self보다는 Person이라는 class 이름을 줘서

공유하고 있다는 것을 코드를 살펴보는 사람에게 명확하게 암시를 해준다.

 

 

 

인스턴스 속성 사용하기

그렇다면, bag를 공유하지 않으려면 어떻게 해야 할까?

class Person:
    def __init__(self):
        self.bag = []

    
    def put_bag(self, stuff):
        self.bag.append(stuff)

james = Person()
james.put_bag('책')


maria = Person()
maria.put_bag('열쇠')

print(james.bag)
print(maria.bag)

>>>['책']

>>>['열쇠']

 

인스턴스 속성으로 만들면 된다.

인스턴스 속성은 인스턴스별로 독립되어 있어서 서로의 영향을 줄 수가 없다.

 

따라서 변수를 __init__(self) (생성자)에 생성함으로써 코드의 독립을 만들어 준다.

 

 

 

정적 메서드 : class  안부르고 바로 사용.  @staticmethod

@Staticmethod
def 메서드(매개변수)
	코드

@staticmethod처럼 @이 붙은 것을 데코레이터라고 하며 메서드 (함수)에 추가 기능을 구현 할 때 사용한다.

 

이는 메서드를 사용 할 때 기본적으로 class를 불러오지만, class를 불러오지 않고 곧 바로 사용 할 수 있게 해준다.

 

 

class Calc:
    @staticmethod
    def add(a, b):
        print(a + b)

    @staticmethod
    def mul(a, b):
        print(a * b)

Calc.add(10, 20)
Calc.mul(10, 20)

>>>30

>>>200

 

클래스 이름을 붙이고 바로 메서드를 사용해서 불러오는 것을 확인 할 수가 있다.

 

 

클래스 메서드 :  @classmethod  ...... cls <-- self

정적 메서드와 비슷하지만 약간의 차이점이 있다. <<= 포인트

메서드 위에 @classmethod를 붙인다.

첫 번째 매개변수는 self가 아닌 cls가 들어간다.(cls는 class의 줄임말이다.)

class Person:
    count = 0

    def __init__(self):
        Person.count += 1

        
    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다. '.format(cls.count))

james = Person()
maria = Person()

Person.print_count()

>>> 2명 생성되었습니다.

 

 

@staticmethod가 있어서 똑같이 이가 static인지 아닌지 구분할 필요가 생겼다.

그래서 classmethod를 줘서 얘가 static이 아니라는 것을 암시 해준다.

 

'중급_문법' 카테고리의 다른 글

북마크. 즐겨찾기 앱으로 ... url , generic View  (0) 2023.11.05

댓글