0%

Python - Class 정리

클래스

  • 객체를 만들기 위한 틀, 클래스 자체도 객체이다
1
2
3
4
5
6
7
8
# 클래스 예시

class Gen:
def __init__(self):
self.number = 0

def plus_number(self):
self.number += 1
  • __init__(self) : 생성자의 역할, 클래스에 필수로 정의되야 한다
  • self : 클래스 자신을 카리킨다

특징

  • 파이썬에서 private로 변수를 지정하려면, __변수명 식으로 선언하면 된다.
    • 하지만 이 변수에 외부에서 접근이 불가능하지 않다. private로 선언한 변수는 클래스 내부에 __클래스명__변수명 으로 저장되는데, 이것을 네임 맹글링이라고 한다.
    • _변수명은 protected 지정자이다. 하지만 이것은 파이썬 사용자들간의 약속일 뿐 아무런 접근 제한도 존재하지 않는다.

Getter, Setter

  • getter, setter는 다른 언어처럼 따로 작성하지 않는다

getter

  • 데코레이터인 @property를 이용해 작성한다.

    1
    2
    3
    4
    #getter 예시
    @property
    def name(self):
    return self.name
  • 이렇게 하면 인스턴스.변수명 으로 함수 호출이 아닌 표현식 처럼 사용이 가능하다.

  • 이렇게 사용하는 이유는, 외부에서 클래스 변수에 접근하여 변경하는 것을 막기 위해서이다

Setter

  • getter를 먼저 생성해야 만들 수 있다
1
2
3
@name.setter
def name(self, ...):
self.name = ...
  • 이렇게 만드는 이유는 , setter를 만들 때 입력 조건 형성이 가능하게 된다.

Method

Instance method

  • 첫번째 인자로 self를 가진다

  • 인스턴스를 이용해 호출

    1
    2
    3
    4
    5
    6
    class Gen:
    def __init__(self):
    self.number = 0
    # 인스턴스 매서드
    def plus_number(self):
    self.number += 1

Class method

  • 첫번째 인자로 cls 를 가진다

  • cls는 클래스 자체를 의미한다

  • 클래스 매서드는 클래스 속성에 대해 동작한다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Gen:
    description : '++number++'
    def __init__(self):
    self.number = 0
    # 인스턴스 매서드
    def plus_number(self):
    self.number += 1

    #클래스 매서드는 @classmethod 데코레이터를 사용한다
    #Gen의 클래스 속성인 description을 출력한다
    @classmethod
    def print_desc(cls):
    print(cls.description)

    #사용 예시, 클래스 자체를 사용
    Gen.print_desc()

Static method

  • 클래스 내부에 정의된 일반 함수이다

  • 클래스나 인스턴스를 통해 접근 가능

  • 클래스나 인스턴스에 영향을 줄 수 없다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import random


    class Gen:
    description : '++number++'
    def __init__(self, number):
    self.number = number

    # 정적 매서드는 @staticmethod 데코레이터를 사용한다
    # 1 - 100 범위의 임의의 수로 Gen 클래스의 인스턴스를 생성
    @staticmethod
    def plus_gen(self):
    return Gen(random.randint(1, 100)

상속

  • 부모 클래스의 기능들을 사용할 수 있게 한다
  • 같은 이름의 내부 함수를 오버라이딩 할 수 있다
  • super() 를 사용하면 부모 클래스의 함수를 사용할 수 있다

동적 바인딩

  • 타입을 신경쓰지 않고 인스턴스를 사용 가능하게 한다
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
class Dog:
def __init__(self, name):
self.name = name

def print_bark(self):
print('멍멍')


class Cat:
def __init__(self, name):
self.name = name

def print_bark(self):
print('야옹')


def animal_sound(animal):
animal.bark()

dog = Dog('A')
cat = Cat('B')

dog = Dog('A')
cat = Cat('B')

#결과 : 멍멍
# 야옹
  • 위에서 animal_sound() 함수는 여러 역할을 할 수 있다, Dog 클래스의 bark()를 실행할 수도 있고 Cat 클래스의 bark()를 실행할 수도 있다. 이것을 다형성 이라고 한다.
  • 또, 이 함수에서는, 인자에 Dog, Cat중 어떤 클래스가 들어가더라도 클래스의 bark()를 제대로 실행하게 된다
  • 즉, 동적으로 바인딩할 때, 인자의 타입에 영향을 받지 않고, 오직 객체해당 속성을 가졌는지만 검사한다.
  • 위의 예시에서는 인자가 bark() 메서드를 가졌는지만 검사한다.

참조