클래스

  • 인스턴스의 모형이 되는 객체
  • 클래스는 인스턴스를 만들기 위한 모형
  • 클래스에서 정의하는 것은 인스턴스 변수나 인스턴스 메서드뿐만 아니라 클래스 변수나 클래스 메서드도 클래스의 일부로 정의
  • 클래스 변수나 클래스 메서드는 클래스 객체의 속성이기 때문에 인스턴스가 없이도 이용할 수 있음

클래스 변수

  • 클래스 객체에 속한 변수로 클래스 객체에서 참조할 수 있음
  • 또한, 인스턴스 변수와 마찬가지로 그 클래스의 인스턴스에서도 클래스 변수를 참조할 수 있음
  • 단 인스턴스 변수와 달리 해당 클래스의 모든 인스턴스에서 같은 변수를 공유
  • 클래스 변수는 클래스 정의의 최상위에 변수를 정의해 만들수 있음

클래스와 인스턴스의 프라이빗 속성

  • 언더스코어

    • 언더스코어(_)를 붙인 인스턴스 변수명 _discount를 이용
    • 앞 문자에 _를 붙인 이유는 인스턴스 변수 _discount가 클래스나 인스턴스 사용자에게는 공개할 필요 없는 내부용 프라이빗 변수이기 때문임
    • 즉 언드스코어로 시작하는 변수나 메서드는 속성이 프라이빗 속성임을 표현
    • 파이썬은 다른 언어처럼 프라이빗 속성을 강제로 할 수는 없음
  • 더블언더스코어

    • 속성 앞 문자에 언더스코어를 두개 붙이면 이름 수식을 실행
    • 이름 수식이란 아래 예제처럼 사용자가 만든 클래스의 변수를 변환하는데 이는 서브 클래스에서의 이름이 충돌나는 것을 방지하기 위해 사용합니다.
class Klass:
    def __init__(self, x):
        self.__x = x 
        
kls = Klass(10)

kls._Klass__x

클래스 메서드

  • 클래스 메서드는 클래스에 속한 메서드로, 첫 번째 인수에 클래스 객체를 전달
  • 클래스 메서드는 @classmethod를 붙이는 점 이외에는 인스턴스 메서드와 동일한 형태로 정의
  • 단 첫번째 인수가 클래스 객체이므로 일반적으로 self가 아니라 cls라고 기술함
# 속성을 이용한 정렬에 사용할 수 있는 표준 라이브러리 임포트 
from operator import attrgetter

class Page:
    book_title = "Python book"
    def __init__(self, num, content, section=None):
        self.num = num
        self.content = content 
        self.section = section 
    def output(self):
        return f"{self.content}"
    # 클래스 메서드의 첫 번째 인수는 클래스 객체 
    @classmethod
    def print_pages(cls, *pages):
        # 클래스 객체 이용 
        print(cls.book_title)
        # 정렬출력 
        for page in sorted(pages, key=attrgetter('num')):
            print(page.output())

first = Page(1, "first page")
second = Page(2, 'second page')
third = Page(3, 'third page')


Page.print_pages(first, third, second)
Python book     #출력값
first page
second page
third page
first.print_pages(first, third, second)
Python book  #출력값
first page
second page
third page

스택틱 메서드

  • 함수처럼 동작하는 메서드
  • 클래스 메서드와 거의 같은 구문으로 @staticmethod를 사용해 만들 수 있음
  • 스태틱 메서드의 인수에는 인스턴스나 클래스 객체는 전달되지 않고, 호출 시 전달한 값이 그대로 전달
  • 즉 스태틱 메서드는 단순한 함수와 같음
class Page:
    def __init__(self, num, content, section=None):
        self.num = num
        self.content = content 
        self.section = section 
    @staticmethod
    def check_blank(page):
        return bool(page.content)

클래스 상속이란?

클래스에서 상속이란, 물려주는 클래스(Parent Class, Super class)의 내용(속성과 메소드)을 물려받는 클래스(Child class, sub class)가 가지게 되는 것

  • 베이스 클래스(부모)의 속성을 상속 받는 개념
  • 오버라이드 : 부모 클래스가 가진 메서드와 같은 이름의 메서드를 다시 정의
  • super() : 부모의 클래스의 메서드를 호출
class Page:
    def __init__(self, num, content):
        self.num = num 
        self.content = content
    def output(self):
        return f'{self.content}'
    
class TitlePage(Page):
    def output(self):
        title = super().output()
        return title.upper()
        
title = TitlePage(0, 'Python book')

title.output()
'PYTHON BOOK' #출력값

다중 상속

  • 여러 부모 클래스한테 상속 받습니다.
  • 예제
class HTMLPageMixin:
    def to_html(self):
        return f'<html>{self.output()}<html>'
    
class WebPage(Page, HTMLPageMixin):
    pass

page = WebPage(0, 'web content')

page.to_html()
 '<html>web content<html>' #출력값

profile
공부 기록

0개의 댓글