본문 바로가기

개발 공부/Python

프로그래밍 시작하기 : 파이썬 입문 6. 클래스, 모듈, 패키지~7.예약처리

프로그래밍 시작하기 : 파이썬 입문(Inflearn Original)

 

6. 파이썬 클래스 및 모듈, 패키지

 

6-1. Class : 객체지향 들어보셨죠?

 

# OOP 객체지향 프로그래밍, self, 인스턴스 메소드, 인스턴스 변수
# 클래스 and 인스턴스 차이 이해

# 예제1
class Dog: #Object 상속
    # 클래스 속성
    species = 'firstdog'

    # 초기화/인스턴스 속성
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 인스턴스 : 코드에서 사용되는 실제
# 클래스 정보
print("info- ", Dog)

# 인스턴스화
a = Dog("micky", 2)
b = Dog("baby", 3)

# 비교
print(a==b, id(a), id(b))

c = Dog("micky", 2)
# 인스턴스화 시킨 건 전부 다르다.

# 네임스페이스 : 객체를 인스턴스화 할 때 저장된 공간
print('dog1', a.__dict__)
# 클래스 변수 : 직접 접근 가능, 인스턴스 변수 : 객체마다 별도 존재


# 인스턴스 속성 확인
print('{} is {} and {} is {}'.format(a.name, a.age, b.name, b.age))
if a.species == 'firstdog':
    print('{0} is a {1}'.format(a.name, a.species))

print(Dog.species)

 

 

 


#self 의 이해
class SelfTest:
    def func1():         # 클래스 메소드
        print("Func1 called")
    def func2(self):   # 인스턴스화 시킨 변수만 호출 가능.
        print("Func2 called")
        print(self)
# init이 없어도 파이썬이 내부에서 자동으로 만들어줌

f = SelfTest()
print(dir(f))

print(id(f))
#f.func1() #에러 # 자동으로 instance 의 id를 넘긴다.
f.func2()
SelfTest.func1()

 

 

# 클래스 변수, 인스턴스 변수

class Warehouse:
    stock_num = 0  # 재고
    def __init__(self, name):
        #인스턴스 변수
        self.name= name
        Warehouse.stock_num +=1
    def __del__ (self): # 소멸자
        Warehouse.stock_num -= 1

user1 = Warehouse('Lee')

user2 = Warehouse('Cho')

print(Warehouse.stock_num)
print(user1.name)
print(user2.name)
print(user1.__dict__)
print(user2.__dict__)
print(Warehouse.__dict__)

 

del user1

로 소멸자 호출 가능, 객체가 지워짐

 

 

#

class Dog:
    species = 'firstdog' # 클래스 속성
    def __init__(self, name, age): #초기화, 인스턴스 속성
        self.name = name
        self.age = age
    def info(self):
        return '{} is {} years old'.format(self.name, self.age)
    def speak(self, sound):
        return "{} says {}!".format(self.name, sound)

c = Dog('july', 4)
#메소드 호출
print(c.info())
print(c.speak('Wal Wal'))

d = Dog("marry", 10)
print(d.info())

 

 

 

 

6-2. Module : 파이썬에서는 모듈 단위로 일을 해요

 

# 파이썬 모듈
# Module : 함수, 변수, 클래스 등 파이썬 구성 요소 등을 모아놓은 파일

def add(x, y):
    return x+y;

def sub(x, y):
    return x-y;

def mul(x, y):
    return x*y;

def div(x, y):
    return x/y;

def pow(x, y):
    return x ** y

print('-' * 15)
print('called! inner!')
print(add(5, 5))
print(sub(5, 10))
print(mul(3, 3))
print(div(10, 2))
print('-' * 15)

 

# 모듈 사용 실습
import sys
print(sys.path)
print(type(sys.path))

# 모듈 경로 삽입
sys.path.append('./math')
print(sys.path)


import test_module

# 모듈 사용
print(test_module.pow(10,3))

 

# __name__ 사용
if __name__ == "__main__":
    print('-' * 15)
    print('called! inner!')
    print(add(5, 5))
    print(sub(5, 10))
    print(mul(3, 3))
    print(div(10, 2))
    print('-' * 15)

 

파일을 직접 실행할 때만 코드가 실행됨.

 

 

 

 

6-3. Package : 패키지 구조를 알아야 파이썬을 쉽게 이해해요.

 

# 파이썬 패키지
# 파이썬은 패키지로 분할 된 개별적인 모듈로 구성
# 상대경로 : ..(부모), .*(현재) -> 모듈 내부에서만 사용

import sub.sub1.module1

import sub.sub2.module2

sub.sub1.module1.mod1_test1()
sub.sub1.module1.mod1_test2()

sub.sub2.module2.mod1_test1()
sub.sub2.module2.mod1_test2()

 

 

 

print()
print()

from sub.sub1 import module1 
from sub.sub2 import module2 as m2
module1.mod1_test1()
m2.mod1_test1()
#from sub.sub1 import *
#module1.mod1_test1()

 

__all__ = ['module1']

__init__.py : Python 3.3부터는 없어도 패키지로 인식. 단, 하위 호환을 위해 작성 추천.

init에서 외부에서 사용할 수 있는 파일을 선별해서 넣을 수 있음

 

 

 

7. 파이썬 예외처리

 

7-1. Exception : 앗! 에러가 발생할 경우 처리해야겠죠?

 

# 파이썬 예외처리의 이해
# 예외 종류 : syntaxError, TypeError, NameError, IndexError, ValueError, KeyError...
# 문법적으론 예외가 없지만 코드 실행 프로세스(단계) 발생하는 예외도 중요

# 예외는 반드시 처리해야 한다.
# 로그를 반드시 남기는 것이 좋다
# 예외는 던져진다.
# 예외 무시

# syntaxError : 문법 오류
# print('error'))
# if True

# NameError : 참조 없음
# a = 10
# print(c)

# ZeroDivisionError
# prinnt(100/0)

# IndexError
#x = [50, 70, 90]
#print(x[4])

# KeyError
#dic = {'name' : 'Lee', 'Age': 40}
#print(dic['hobby'])

# 예외 없는 것을 가정하고 프로그램 작성 시 -> 런타임 예외 발생 시 예외 처리를 권장
# EAFP에 적혀 있다.
# AttributeError : 모듈, 클래스에 있는 잘못된 속성 사용 예외
# print(time.time2())

# ValueError
# x = [10, 50, 90]
# x.remove(50)
# x.remove(200)  # value error. 리스트 안에 값이 없을 떄

# FileNotFoundError
# f = open('test.txt')

# TypeError : 자료형에 맞지 않는 연산 수행 시
# x = [1, 2]
# y = (1, 2)
# print(x+y) # 가변형 + 불변형은 더할 수 없다.

# 예외 처리
# try : 에러가 발생할 가능성이 있는 코드 실행
# except 예러명2 : 여러 개 가능.
# else : try 블록의 에러가 없을 경우 실행
# finally : 항상 실행되는 블록

name = ['Kim', 'Lee', 'Park']

# 예제1
try:
    z = 'Kim'
    x = name.index(z)
    print('{} Found it! {} in name'.format(z, x+1))
except ValueError:
    print('Not found it! - Occurred ValueError!')
else:
    print('Ok! else.')

print()

name = ['Kim', 'Lee', 'Park']

# 예제1
try:
    z = 'Cho'
    x = name.index(z)
    print('{} Found it! {} in name'.format(z, x+1))
except ValueError:
    print('Not found it! - Occurred ValueError!')
else:
    print('Ok! else.')

print()
print("kk")

 


# 예2

try:
    z = 'Cho'
    x = name.index(z)
    print('{} Found it! {} in name'.format(z, x+1))
except: # 모든 에러를 다 잡는다. 어떤 에러가 발생할지는 모른다
   # exception Exception이라고 적을 수도 있음.
    print('Not found it! - Occurred ValueError!')
else:
    print('Ok! else.')

print()
print("kk")
name = ['Kim', 'Lee', 'Park']

print()
try:
    z = 'Cho'
    x = name.index(z)
    print('{} Found it! {} in name'.format(z, x+1))
except Exception as e:
    print(e) # 에러의 내용 출력
    print('Not found it! - Occurred ValueError!')
else:
    print('Ok! else.')
finally:
    print('Ok! finally')
    
print()
print("kk")

rint()

# 예제 4
# 예외 발생 : raise(직접 발생 시킴)
try:
    a = 'Park'
    if a == 'Kim':
        print('Ok! Pass!')
    else:
        raise ValueError
except ValueError:
    print('Occurred Exception.')
else:
    print('Ok. else')