클래스
- 변수, 함수를 묶어서 코드를 작성하는 방법
- 객체지향을 구현하는 문법
객체지향 : 실제세계를 모델링하여 프로그램을 개발하는 개발 방법론 : 협업을 용이하게 하기 위함
계산기 설계하여 클래스 작성
1. 클래스 선언 : 코드작성
class Calculator:
number1, number2 = 1, 2
def plus(self):
return self.number1 + self.number2
def minus(self):
return self.number1 - self.number2
2. 객체 생성 : 메모리사용
calc1 = Calculator()
calc2 = Calculator()
dir() : 객체에 들어있는 변수를 출력
[data for data in dir(calc1) if data[0] != '_']
>> ['minus', 'number1', 'number2', 'plus']
3. 메서드 실행 : 코드실행
calc1.plus(), calc1.minus()
>> (3, -1)
self
- 객체 자신
- self를 사용함으로써 클래스 내부에 정의된 멤버에 접근할 수있다.
위의 계산기 코드로 이해해보면
Calculator.plus = self.number1 + self.number2
이 아래에서 객체를 생성하면서 calc1 라는 인스턴스가 만들어진다.
calc1 = Calculator()
여기서 이제 self는 calc1를 가르키게 되는 것이다.
calc1.plus = calc1 .number1 + calc1 .number2
스페셜 메서드
- 특별한 기능을 하는 메서드 : 앞뒤로 __를 붙인다.
생성자 메서드 : __init__()
- 객체를 생성할 때 실행되는 메서드
- 변수의 초기값을 설정할 때 주로 사용
- 불량객체(메서드 사용X)가 만들어질 확률을 줄여줌
# 클래스생성 : 설계도작성
class Account:
def __init__(self, balance =20000): # 호출을 하지 않아도 객체 생성시 자동으로 실행
self.balance = balance
def insert(self, amount):
self.balance += amount
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
else:
print(f'잔액이 {amount-self.balance}원 부족합니다.')
# 객체생성 : 메모리사용
account = Account()
# 메서드실행 : 코드실행 : 기능사용 : 불량품 생산
account.insert(3000)
account.balance
>> 23000
클래스는 사용자 정의 데이터 타입이다
accout의 데이터 타입은 Accout 이다.
accout 객체가 만들어진 클래스는 Account 이다.
데이터 타입 == 클래스 > 클래스는 데이터 타입이다.
Account 클래스는 우리가 만들었다 > 사용자 정의
따라서 클래스는 사용자 정의 데이터 타입이다!
type(account)
>> __main__.Account
list 와 비교해서 생각하면 더 쉽게 생각할 수 있다.
data = [1, 2, 3]
type(data)
>> list
data의 데이터 타입은 list이다.
data 객체가 만들어진 클래스는 list이다.
list 클래스는 우리가 만들지 않았다.
참고로 아래와 같은 코드를 알아두면 데이터 타입의 메서드를 암기할 필요가 없다.
print([var for var in dir(data) if var[0] != '_'])
>> ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
__add__() : + 연산자 정의
__str__(): print() 함수 실행 정의
# 덧셈연산을 하지만 뺄셈연산이 수행되는 객체를 생성
class Number:
def __init__(self, data):
self.data = data
def __add__(self, obj):
return self.data - obj.data
def __str__(self):
return str(self.data)
def __repr__(self):
return str(self.data)
num1 = Number(10)
num2 = Number(3)
num1.data, num2.data
>> (10, 3)
num1+ num2
>> 7
상속
- 다른 클래스의 변수(메서드)를 가져와서 사용하는 방법
class iPhone1:
def call(self):
print('calling!')
class iPhone2:
def call(self):
print('calling!')
def send_msg(self):
print('send_msg!')
class iPhone3:
def call(self):
print('calling!')
def send_msg(self):
print('send_msg!')
def internet(self):
print('internet!')
위의 코드를 상속을 사용하여 간단하게 변경
class iPhone1:
def call(self):
print('calling!')
class iPhone2(iPhone1):
def send_msg(self):
print('send_msg!')
class iPhone3(iPhone2):
def internet(self):
print('internet!')
파이썬은 다중 상속이 가능하다
class Human:
def walf(self):
print('walking!')
class Korean:
def eat(self):
print('eat kimchi!')
class Indian:
def eat(self):
print('eat curry!')
# Human > Korean > Jin 순으로 상속받음
class Jin(Korean, Human):
def skill(self):
print('coding')
jin = Jin()
show_vars(jin)
>> ['eat', 'skill', 'walf']
데코레이터
- 함수에서 중복되는 코드를 뺴서 데코레이터 함수로 만들어 코드를 작성하는 방법
- 원래 있던 함수에 새로운 기능을 추가한 함수로 변경할 떄 주로 사용
- 여러개일때는 아래에서부터 위로 올라가는 순서 << 아직 이해가 가지 않음 ㅠ
# timer 데코레이터 함수 생성
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time() # 현재시간 저장
result = func(*args, **kwargs)
end = time.time() # guswotlrks wjwkd
print(f'running time : {end -start} sec')
return result
return wrapper
@timer
def plus(n1, n2):
return n1 + n2
@timer
def minus(n1, n2):
return n1 - n2
plus(3,2)
>>
running time : 9.5367431640625e-07 sec
5
minus(3,2)
>>
running time : 9.5367431640625e-07 sec
1
'Python' 카테고리의 다른 글
[Python] 기초 문법 - 입출력 (0) | 2023.01.06 |
---|---|
[Python] 기초 문법 - 클래스(2) (0) | 2023.01.06 |
[Python] 네이버 파파고 번역 API 사용하기 (0) | 2023.01.04 |
[Python] 기초 문법 - 함수 (0) | 2023.01.04 |
[Python] 기초 문법 - 연산자, 조건문, 반복문 (0) | 2023.01.03 |