euny!
errorlog
euny!
전체 방문자
오늘
어제
  • 분류 전체보기 (22)
    • Python (13)
    • 데이터분석 (3)
    • WIL (4)
    • SQL (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 크롤링
  • BeautifulSoup
  • ㅗ
  • 웹스크래핑
  • SQL
  • 웹크롤링

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
euny!

errorlog

[Python] 기초 문법 - 클래스(1)
Python

[Python] 기초 문법 - 클래스(1)

2023. 1. 5. 15:59

클래스

- 변수, 함수를 묶어서 코드를 작성하는 방법

- 객체지향을 구현하는 문법

    객체지향 : 실제세계를 모델링하여 프로그램을 개발하는 개발 방법론 : 협업을 용이하게 하기 위함

 

계산기 설계하여 클래스 작성

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
    'Python' 카테고리의 다른 글
    • [Python] 기초 문법 - 입출력
    • [Python] 기초 문법 - 클래스(2)
    • [Python] 네이버 파파고 번역 API 사용하기
    • [Python] 기초 문법 - 함수
    euny!
    euny!

    티스토리툴바