[TIL. 15] Python - Class

신지원·2021년 3월 11일
0

Python

목록 보기
4/14
post-thumbnail

class

class는 데이터 타입을 위한 템플릿이다.
객체를 만들때 사용한다.

1. Class, Method, instance

# class 생성
class 클래스이름:        # 클래스의 이름은 대문자로 시작
    def 메서드(self):   # 메서드 작성 , 메서드의 첫번째 매개변수는 반드시 slef를 지정해야 한다.
        코드
        

class Person:
     def greeting(self):
         print('Hello')
         
# 빈클래스 만들기 
class 클래스 이름:
	pass

         
# 인스턴스 (instance)
james = Person()     # james는 Person의 인스턴스(instance)가 된다.         
         

# 메서드 호출하기(메서드는 클래스가 아니라 인스턴스를 통해 호출해야 한다.)
# 인스턴스.메서드()
james.greeting()    #Hello


# 메서드 안에서 메서드 호출하기
# self.메서드() 형식으로 호출해야 한다. 만약 self 없이 메서드 이름만 
사용하면 클래스 바깥쪽에 있는 함수를 호출한다는 뜻이 된다.
class Person:
    def greeting(self):
        print('Hello')
 
    def hello(self):
        self.greeting()    # self.메서드() 형식으로 클래스 안의 메서드를 호출
 
james = Person()
james.hello()    # Hello


# 특정 클래스의 인스턴스인지 확인하기
# isinstance(인스턴스, 클래스) 함수 사용. (True, False 를 반환)
isinstance(james,Person)      #True
# isinstance는 객체의 자료형을 판단할 때 사용한다. 
         
  • 클래스는 특정 개념을 표현만 할 뿐 사용을 하려면 인스턴스를 생성해야 한다.
  • 클래스는 객체를 표현하는 문법이다.
  • 인스턴스 메서드: 인스턴스를 통해 호출하는 메서드
  • 파이썬에서느 자료형도 클래스이다.

  • 인스턴스와 객체의 차이점은?
    인스턴스와 객체는 같다. 보통 객체만 지칭하면 object 객체라고 부르고, 클래스와 연관지어 말할 때에는 instance 인스턴스라고 부른다.
a = list(range(10))
b = list(range(20))

여기서 리스트 변수 a,b 는 객체이다. 그리고 a,b는 list클래스의 인스턴스이다.

2. 클래스의 속성(인스턴스 속성) (constructor) (생성자)

class 클래스이름:
    def __init__(self):    # 무조건 __init__ 사용
        self.속성 =class Person:
    def __init__(self):
        self.hello = '안녕하세요.'    # 이부분이 속성 부분..
 
    def greeting(self):
        print(self.hello)
 
james = Person()
james.greeting()    # 안녕하세요.
  • __init__은 기본형태임.

  • 속성을 만들 때는 __init__메서드 안에서 self.속성에 값을 할당 하면 된다.

  • __init__ 메서드는 james = Person() 처럼 class에 괄호()를 붙여서 인스턴스를 만들 때 호출되는 특별한 메서드이다.

  • 속성은 항상 __init__ 메서드에서 만든다는 점과 self에 .(점)을 붙인 뒤 값을 할당한다는 점이 중요하다.

  • 객체에서 사용할 초기값들을 초기화 한다.

__init__ 을 이용하여 객체가 생성될때에는 init 함수에 정의된 동일 한 갯수만큼 속성값을 넣어주어야 한다. (self 제외)

2-1. self란?

인스턴스 자기 자신을 의미한다.

2-2. 인스턴스를 생성한 뒤에 속성 추가, 특정 속성만 허용하기

# 인스턴스를 생성한 뒤에 속성 추가
# class 밖에서 접근
class Person:
	pass

maria = Person()         # 인스턴스 생성
maria.name = '마리아'    # 인스턴스를 만든 뒤 속성 추가

# 이렇게 추가한 속성은 해당 인스턴스에만 생성된다.




# 인스턴스는 생성한 뒤에 속성을 추가할 수 있다. 그래서 __init__ 메서드가 아닌 다른 메서드에서도 속성을 추가 할 수 있다. 다만... 메서드를 먼저 호출해 주어야 속성이 생성된다.
# 여기서 만약에 `james.greeting()` 을 호출하지 않으면 hello 속성을 불러오지 못한다.
class Person:
    def greeting(self):
        self.hello = '안녕하세요'     

james = Person()
james.greeting()
hi = james.hello

print(hi)  #안녕하세요




# 특정 속성만 허용하고 다른 속성 추가 금지하기
# 속성 이름은 반드시 문자열로 지정.
# __slots__['속성이름1','속성이름2']

class Person:
    __slots__ = ['name', 'age']  # name, age만 허용(다른 속성은 생성 제한)

james = Person()
james.name = '제임스'
james.age = 12
# james.feeling = 'good'    #feeling 이라는 속성은 만들어 지지 않는다.


2-3. 인스턴스 만들때 값 받기 (class 안에서 동시에 값 받기)

# 인스턴스 만들때 값 받기
class 클래스이름:
    def __init__(self, 매개변수1, 매개변수2):
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2
        

-------------------------
# person 클래스로 인스턴스를 만들 때 이름,나이,주소를 받아보기

class Person:
    def __init__(self, name, age,  address):      
        self.hello = '안녕하세요.'     
        self.name = name
        self.age = age
        self.address = address
 
    def greeting(self):
        print('{0} 저는 {1}입니다.'.format(self.hello, self.name))    # name 속성에 접근할때는 꼭 self.name 으로 접근 해야 한다.
 
maria = Person('마리아', 20, '서울시 서초구 반포동')
maria.greeting()    # 안녕하세요. 저는 마리아입니다.
 
print('이름:', maria.name)       # 마리아
print('나이:', maria.age)        # 20
print('주소:', maria.address)    # 서울시 서초구 반포동        


# 속성들:  hello, name, age, address

속성들 접근 방법!!!

class Person:
    def __init__(self, name, age, address):
        self.hello = '안녕하세요.'
        self.name = name
        self.age = age
        self.address = address
  • 메서드에서 slef로 접근 하는 법
maria = Person('마리아', 20, '서울시 서초구 반포동')
  • 속성 형식으로 클래스 밖에서 접근
maria.name

그러니깐..! 기본 형태가 이런식...!!

class Class_name:
	속성들  ('__init__' 사용해서)
   	method ('def' 사용)


3. 비공개 속성

클래스 밖에서는 접근 할 수 없고 클래스 안에서만 사용할 수 있는 비공개 속성
이름 앞에 __두개를 사용하면 된다.

중요한 값이기 때문에 함부로 바꿀수 없도록 하기위해서 비공개 속성을 사용한다. 비공개의 속성은 클래스의 메서드로만 바꿀수 있다.

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):
        self.__wallet -= amount   # 비공개 속성은 클래스 안의 메서드에서만 접근할 수 있음
        print('이제 {0}원 남았네요.'.format(self.__wallet))
 
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.pay(3000)

# maria.__wallet은 안됨. (클래스 밖이기 때문에)
  • 메서드에도 __로 시작하면 클래스 안에서만 호출 할 수 있는 비공개 메서드가 된다.
    내부에서만 호출되어야 하는 메서드를 비공개 메서드로 만든다.
class Person:
    def __greeting(self):
        print('Hello')
 
    def hello(self):
        self.__greeting()    # 클래스 안에서는 비공개 메서드를 호출할 수 있음
 
james = Person()
james.__greeting()    # 에러: 클래스 바깥에서는 비공개 메서드를 호출할 수 없음

4. 클래스 속성

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)   #['책', '열쇠']

james와 maria 인스턴스를 만들고 각자 put_bag 메서드로 물건을 넣었는데, james.bag과 maria.bag을 출력해보면 넣었던 물건이 합쳐져서 나온다. 즉, 클래스 속성은 클래스에 속해 있으며 모든 인스턴스에서 공유합니다.

put_bag 메서드의 self는 현재 인스턴스를 뜻하고, 클래스 속성을 지칭하기앤 애매하다.

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

Person.bag 이런식으로 클래스 이름으로 접근하면 Person 클래스 bag 속성이라는 것을 바로 알 수 있다. 클래스 밖에서도 사용 가능.

  • 가방을 여러 사람들이 공유 하지 않고 각각 사용할 수 있도록 하는 방법은??
    => 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)     # ['열쇠']

즉, 인스턴스 속석은 인스턴스 별로 독립되어 있으며 서로 영향을 주지 않는다.

  • 인스턴스 속성과 클래스 속성과 차이점
    • 인스턴스 속성: 인스턴스별로 독립되어 있음. 각 인스턴스가 값을 따로 저장해야 할 때 사용
    • 클래스 속성: 모든 인스턴스가 공유. 인스턴스 전체가 사용해야 하는 값을 저장할 때 사용

4-1. 비공개 클래스 속성

앞에서랑 똑같이 밑줄 두개__ 를 사용한다.

class 클래스이름:
    __속성 =# 비공개 클래스 속성


class Knight:
    __item_limit = 10    # 비공개 클래스 속성
 
    def print_item_limit(self):
        print(Knight.__item_limit)    # 클래스 안에서만 접근할 수 있음
 
 
x = Knight()
x.print_item_limit()    # 10
 
print(Knight.__item_limit)    # 클래스 바깥에서는 접근할 수 없음

5. 정적 메서드, 클래스 메서드

원래 클래스의 메서드는 인스턴스를 통해서 호출할 수 있었다. 근데 인스턴스를 통하지 않더라도 클래스에서 바로 호출할 수 있는 정적 메서드클래스 메서드가 있다.

5-1. 정적 메서드

정적 메서드는 메서드 위에 @staticmethod를 붙인다. 이때 정적 메서드는 매개변수에 self를 지정하지 않는다.

인스턴스 없이 클래스만을 가지고 바로 메서드 호출

class 클래스이름:
    @staticmethod
    def 메서드(매개변수1, 매개변수2):
        코드
        

----------------
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

이 처럼 정적 메서드는 self를 받지 않았음으로 인스턴스 속성에 접근 할 수 없다. 그래서 보통 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용한다.

  • 정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)를 만들 때 사용합니다. 순수 함수는 부수 효과(side effect)가 없고 입력 값이 같으면 언제나 같은 출력 값을 반환합니다. 즉, 정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.

5-2. 클래스 메서드

메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용한다.

class 클래스이름:
    @classmethod
    def 메서드(cls, 매개변수1, 매개변수2):
        코드
        
# 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야한다.(cls는 class에서 따왔음.)        
        
        
-------------------

class Person:
    count = 0    # 클래스 속성
 
    def __init__(self):
        Person.count += 1    # 인스턴스가 만들어질 때
                             # 클래스 속성 count에 1을 더함
 
    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근
 
james = Person()
maria = Person()
 
Person.print_count()    # 2명 생성되었습니다.

0개의 댓글