본문 바로가기

PYTHON/Basic

class

객체지향

  • 실제 세계를 모델링하여 공통적인 기능을 묶어 개발


클래스

  • 객체(인스턴스)

    • 식별성, 타입, 값을 지님
    • 자신만의 함수를 가짐
  • 확장성이 높아지는 장점(의존성은 낮아짐)

  • 특성

    • 다형성 : 같은 이름으로 함수를 실행할 때 아규먼트의 차이에 따라 다른 코드가 실행되게 하는 기능 (method overloading)
    • 캡슐화 (은닉화) : 외부에 변수나 함수를 감춰 내용을 알지 못해도 기능 사용 가능 (nonpublic)
    • 추상화 : 여러가지 요소를 하나로 통합해 사용자가 코드를 몰라도 사용 가능

self

  • 객체 자신을 의미
  • 클래스 내부의 함수 선언시 첫번째 parameter
  • 클래스 정의 후 객체, 함수 등을 추가

생성자

  • 클레스가 객체로 만들어질 때 초기값을 설정하는 기능
  • __init__으로 선언
  • 필수 변수가 있어야 객체 생성
# 계산기 클래스
class Calulator:

    def __init__(self, *args, **kwargs):
        self.total = sum(args)
        self.plus = func
        self.num1 = kwargs["num1"]
        self.num2 = kwargs["num2"]

    def set_data(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def add(self):
        return self.plus(self.num1 + self.num2)

c1 = calculator(lambda *args: sum(args), 1, 2, 3, num1=10, num=20)
c1.total
c1.add()


상속

  • 기존 클래스에 새로운 변수나 함수를 추가/수정
  • 부모/자식 클래스
  • is a : A is a B와 같은 의미로 상속 사용해서 클래스 선언
  • has a : B has a A 클래스의 변수를 객체로 받아 객체 생성
class ImprovedCalculator(Calculator):
    def pow_func(self):
        return self.num1 ** self.num2

ic = ImprovedCalculator(2, 3)
ic.add(), ic.pow_func()

다중상속

  • super

    • 부모클래스의 변수나 함수를 받아올 때 사용
    • 부모클래스의 생성자를 다시 선언시 사용
    • 다이아몬드 상속시 중복 생성자 상속 방지
  • overiding

    • 부모클래스가 가지고 있던 함수를 다시 정의해서 사용
  • overloading

    • 함수의 이름은 같으나 argument의 갯수 차이로 다른 코드 실행
class Human:

    def __init__(self):
        self.health = 40

    def set_health(self, var):
        self.health += var
        if self.health > 40:
            self.health = 40
        elif self.health < 0:
            self.health = 0

class Marin(Human):

    def __init__(self, attack_pow=5, kill=0):
        super(Marin, self).__init__()
        self.attack_pow = attack_pow
        self.kill = kill

    def attack(self, obj):
        if obj.health == 0:
            print("already die")
            return
        obj.set_health(-self.attack_pow)
        if obj.health <= 0:
            self.kill +=1
            print("kill")

class Medic(Human):

    def __init__(self, heal_pow=6):
        super(Medic, self).__init__()
        self.heal_pow = heal_pow

    def heal(self, obj):
        if obj.health == 0:
            print("already die")
            return
        obj.set_health(self.heal_pow)

marin1 = Marin()
marin2 = Marin()
medic1 = Medic()
marin1.attack(marin2)
medic.heal(marin1)

Getter & Setter

  • 객체 내부 변수에 접근할 때 특정 로직을 거쳐 접근할 수 있도록 하는 방법
  • getter : 속성 값을 가져오는 메서드
  • setter : 값을 저장하는 메서드
  • 메서드를 속성처럼 사용할 수 있음


property

class Person1:

    def __init__(self):
        self.__age = 0

    def get_age(self):  # getter
        return self.__age

    def set_age(self):  # setter
        self.__age = value

jason = Person1()
jason.set_age(15)
print(jason.get_age())


decolator

class Person2:

    def __init__(self):
        self.__age = 0

    @property
    def age(self):  # getter
        return self.__age

    @age.setter
    def age(self, value):   # setter
        self.__age = value

sumi = Person2()
sumi.age = 23
print(sumi.age)


non public (private)

  • magling 방법으로 구현
  • class 내부 변수에 직접 접근 불가
  • __를 붙여 변수 선언
  • (객체명)._(클래스명)(변수명)으로 접근 가능

클래스 메서드

  • instance method

    • 인스턴스를 통해 호출해서 사용
    • self 파라미터 사용
    • self 객체를 받음
  • class method

    • 클래스를 통해서 사용
    • cls 파라미터 사용
    • cls 클래스를 받음
  • static method

    • 클래스 안에서 선언되는 일반 함수

magic(special) method

  • 클래스에서 객체로 만들어질 떄, 자동 생성 함수
  • 객체 사이의 연산자 사용과 같은 코드 정의
  • compare
    • __eq__ : ==
    • __ne__ : !=
    • __lt__ : <
    • __gt__ : >
    • __le__ : <=
    • __ge__ : >=
  • calculate
    • __add__ : +
    • __sub__ : -
    • __mul__ : *
    • __truediv__ : /
    • __floordiv__ : //
    • __mod__ : %
    • __pow__ : **
  • __repr__
  • __str__
  • __len__

'PYTHON > Basic' 카테고리의 다른 글

input output  (0) 2019.12.28
regex  (0) 2019.12.28
operating system  (0) 2019.12.28
module  (0) 2019.12.28
function  (0) 2019.12.28