한 클래스로 만들어진 두 인스턴스는 독립적인 개체이다.
코드의 재사용이 쉬워진다.
객체와 인스턴스의 차이
클래스 기초
class Service:
secret = "Top Secret"
ob = Service()
print(ob.secret)
class Service:
secret = "Top Secret"
def sum(self, a, b):
result = a + b
print("{0} + {1} = {2}".format(a, b, result))
ob = Service()
ob.sum(13, 15)
ob = Service()
ob.sum(ob, 13, 15)
ob.sum(13, 15) # 같은 결과가 나온다.
class Service:
secret = "Top Secret"
def setName(self, name):
self.name = name
def getName(self):
return self.name
ob = Service()
ob.setName('Lee')
print(ob.getName())
__init__
class Service:
secret = "Top Secret"
def __init__(self, name):
self.name = name
def getName(self):
return self.name
ob = Service('Lee')
print(ob.getName())
클래스 구조
class 클래스 이름[(상속 클래스명)]:
<클래스 변수 1>
<클래스 변수 2>
...
<클래스 변수 n>
def 클래스 함수1(self[, 인수1, 인수2, ...]):
<수행할 문장 1>
<수행한 문장 2>
...
def 클래스 함수2(self[, 인수1, 인수2, ...]):
<수행할 문장 1>
<수행한 문장 2>
...
def 클래스 함수3(self[, 인수1, 인수2, ...]):
<수행할 문장 1>
<수행한 문장 2>
..
예제 : 사칙연산 클래스
class Cal:
def setData(self, a, b):
self.a = a
self.b = b
def sum(self):
return self.a + self.b
def div(self):
return self.a / self.b
def sub(self):
return self.a - self.b
def mul(self):
return self.a * self.b
예제 : ‘박씨네 집’ 클래스
class HousePark:
lastname = "박"
def __init__(self, name):
self.setName(name)
def setName(self, name):
self.firstname = name
self.fullname = self.lastname + name
def travel(self, where):
print("{0}, {1}여행을 간다.".format(self.fullname, where))
상속
class HouseLee(HousePark):
lastname = "이"
ob = HouseLee("파이")
ob.travel("영동")
메서드 오버라이딩(method overriding)
class HouseLee(HousePark):
lastname = "이"
def travel(self, where, day):
print("{0}, {1}여행 {2}일 가네.".format(self.fullname, where, day))
ob = HouseLee("파이")
ob.travel("영동", 13)
# ob.travel("서해안") 에러!
연산자 오버로딩(operator overloading)
class HousePark:
lastname = "박"
def __init__(self, name):
self.setName(name)
def setName(self, name):
self.firstname = name
self.fullname = self.lastname + name
def travel(self, where):
print("{0}, {1}여행을 간다.".format(self.fullname, where))
def __add__(self, other):
print("{0}과 {1}은 결혼했다.".format(self.fullname, other.fullname))
a = HousePark("노을")
b = HousePark("가을")
a + b
# mod1.py
def sum(a, b):
return a + b
# root 디렉토리 아래 Python 디렉토리를 생성하고 디렉토리 안에 저자한다.
import mod1 # 모듈을 불러는 방법
print(mod1.sum(3, 4))
from 모듈이름 import 모듈함수
if __name__ == "__main__":
의 의미
# mod1.py
PI = 3.141592
class Math:
def solv(self, r):
return PI * (r ** 2)
def sum(a, b):
return a + b
# 직접 실행했을 때 아래 코드를 실행시키겠다.
if __name__ == "__main__":
print(PI)
a = Math()
print(a.solv(3))
print(sum(PI, 4.4))
>>>import sys
>>>sys.path
>>>sys.path.append("모듈로 사용할 py파일을 저장한 디렉토리")
# 모듈로 사용할 py파일을 저장한 디렉토리를 PYTHONPATH 환경변수에 추가한다.
set PYTHONPATH=C:\Python\Mymodule
패키지
패키지 만들기
패키지 기본 구성 요소 준비하기
__init__.py
는 비어있는 상태로 둔다.# echo.py
def echo_test():
print("echo")
# render.py
def render_test():
print("render")
패키지 안의 함수 실행하기
# echo 모듈을 import하여 실행
import game.sound.echo
game.sound.echo.echo_test()
# echo 모듈이 있는 디렉터리까지를 from .. import하여 실행
from game.sound import echo
echo.echo_test()
# echo_test 함수를 직접 import하여 실행
from game.sound.echo import echo_test()
echo_test()
import game # game 디렉토리의 모듈 또는 game 디렉토리의
game.sound.echo.echo_test() # __init__.py에 정의 된 것들만 참조 가능
import game.sound.echo.echo_test
# 도트 연산자를 사용해서 import a.b.c 처럼 import할 때 가장 마지막 항목인
# c는 반드시 모듈 또는 패키지여야만 한다.
__init__.py
의 용도
__init__.py
파일이 없다면 패키지로 인식되지 않는다.__all__
의 용도
from game.sound import *
echo.echo_test() # 오류 발생!!!
__init__
파일에 __all__
이라는 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야한다.relative 패키지
# render.py
from game.sound.echo import echo_test
def render_test():
print("render")
echo_test()
# render.py
from ..sound.echo import echo_test
def render_test():
print("render")
echo_test()
except [발생 오류[as 오류 메시지 변수]]:
try:
...
except:
...
try:
...
except 발생 오류:
...
try:
...
except 발생 오류 as 오류 메시지 변수:
...
try:
a = 4 / 0
except ZeroDivisionError as e:
print(e)
try:
f = open('foo.txt', 'r')
except FileNotFoundError as e:
print(e)
else:
data = f.read()
f.close()
f = open('foo.txt', 'w')
try:
# 무언가를 수행한다.
finally:
f.close()
try:
f = open('없는 파일', 'r')
except FileNotFoundError:
pass
raise
를 사용하여 오류를 일부러 발생시킬 수 있다.class Bird:
def fly(self):
raise NotImplementedError
class Eagle(Bird):
def fly(self): # 만들지 않았다면 오류가 발생한다!
print('very fast')
for i, name in enumerate(['body', 'your', 'hot']):
print(i, name)
def positive(numberList):
result = []
for num in numberList:
if num > 0:
result.append(num)
return result
print(positive([1, -3, 2, 0, -5, 6]))
def positive(x):
return > 0
print(list(filter(postive,[1, -3, 2, 0, -5, 6])))
print(int('10A', 16))
lambda 인수1, 인수2, ...: 인수를 이용한 표현식
sum = lambda a, b: a + b
print(sum(3, 4))
# 리스트 내에서도 사용 가능하다.
myList = [lambda a, b: a + b, lambda a, b: a * b]
print(myList[0](3, 4)) # 덧셈
print(myList[1](3, 4)) # 곱셈
def two_times(numberList):
result = []
for number in numberList:
result.append(number * 2)
return result
res = two_times([1, 2, 3, 4])
print(res)
def two_times(x): return x * 2
print(list(map(two_times, [1, 2, 3, 4])))
print(list(map(lambda a: a * 2, [1, 2, 3, 4])))
print(list(range(10)))
print(list(range(0, 10)))
print(list(range(0, 10, 2)))
numlist = [3, 6, 2, 8, 1]
print(sorted(numlist))
print(numlist)
numlist.sort()
print(numlist())
list(zip([1, 2, 3], [4, 5, 6]))
p251
sys 모듈
pickle 모듈
os 모듈
shutil 모듈
glob 모듈
tempfile 모듈
time 모듈
calendar 모듈
random 모듈
webbrowser 모듈
import webbrowser
webbrowser.open("http://google.com")
theading 모듈
import threading
import time
def say(msg):
while True:
time.sleep(1)
print(msg)
for msg in ['you', 'need', 'python']:
t = threading.Thread(target=say, args=(msg,))
t.daemon = True
t.start()
for i in range(100):
time.sleep(0.1)
print(i)
import threading
import time
class MyThread(threading.Thread):
def __init__(self, msg):
threading.Thread.__init__(self)
self.msg = msg
self.daemon = True
def run(self):
while True:
time.sleep(1)
print(self.msg)
for msg in ['you', 'need', 'python']:
t = MyThread(msg)
t.start()
for i in range(100):
time.sleep(0.1)
print(i)