객체지향
- 실제 세계를 모델링하여 공통적인 기능을 묶어 개발
클래스
객체(인스턴스)
- 식별성, 타입, 값을 지님
- 자신만의 함수를 가짐
확장성이 높아지는 장점(의존성은 낮아짐)
특성
- 다형성 : 같은 이름으로 함수를 실행할 때 아규먼트의 차이에 따라 다른 코드가 실행되게 하는 기능 (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 |