오늘은 중국집을 먼저가서 점심을 먹으려고 했지만 웨이팅이 많아서 어제 갔던 분식집으로 갔다.
치킨 카레를 먹었는데 생각보다 매콤했다.
Encapsulation
- 캡슐화 또는 정보 은닉
- 객체의 정보를 볼 수 있는 레벨을 조절하는 것
- 클래스를 설계할 때, 클래스 간 간섭 / 정보 공유의 최소화
python에서는 클래스 내부에서만 사용되는 변수는 언더바 2개를 붙인다 ex) __name
private __name을 조작하기 위해서는 @ 데코레이트(어노테이션)을 사용한다. @property
@property
def year():
return self.year
@year.setter
def year(year):
self.__year = year
항상 getter에 해당하는 property 데코레이트를 먼저 선언하고 setter를 데코레이트를 선언해준다.
# product class
class Product(object):
# constructor
def __init__(self, name):
# __name is private
self.__name = name
def __str__(self):
return 'Product name is {}'.format(self.__name)
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
# object create
product = Product('TV')
# AttributeError: 'Product' object has no attribute '__name'
# call getter
print(product.name)
# call setter
product.name = 'tv'
print(product.name)
Inheritance
부모클래스로 부터 속성과 메서드를 상속 받은 자식 클래스를 생성하는 것
# Inheritance # super class Person class Person(object): # constructor def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def about_me(self): print('name: {}, age: {}, gender: {}'.format(self.name, self.age, self.gender))
child class
class Employee(Person):
def **init**(self, name, age, gender, salary, hire\_date):
super().**init**(name, age, gender)
self.salary = salary
self.hire\_date = hire\_date
def about_me(self):
super().about_me()
print('salary: {}, hire_date: {}'.format(self.salary, self.hire_date))
myPerson = Person('hong',30,'M')
myEmployee = Employee('lee',10,'M',10000,'2020/03/03')
myPerson.about\_me()
myEmployee.about\_me()
Polymorphism
Poly + Morphism : one Interface, Multiple Implementation
python에서는 추상 메서드를 만들때 빈 함수를 만들고 안에 raise 키워드를 이용해 강제로 error를 발생시킨다.
# abstract method를 가진 부모 클래스 선언
class Animal(object):
def **init**(self, name):
self.name = name
#abstract method
def talk(self):
raise NotImplementedError('Subclass must implement abstract method')
class Cat(Animal):
def talk(self):
return 'Meow'
class Dog(Animal):
def talk(self):
return 'Woof'
def pet(self):
return 'I,m Pet'
my\_ani = Animal('동물')
print(my\_ani.name)
# my\_ani.talk()
animals = \[Cat('cat'), Dog('dog'), Dog('dog2')\]
for ani in animals:
print(ani.talk())
\# print(ani.pet())
모듈
빌트인 모듈
파이썬 설치시 제공되는 내장 모듈
링크
써드파티 모듈
외부 모듈로써 별도의 설치가 필요함
import
import 하여 자동 실행되는 것과 직접실행의 차이를 알자
import sys
def say_hello(msg):
print('say_hello: {}'.format(msg))
def main():
# print(sys.argv[0])
msg = sys.argv[1]
# print(msg)
if msg is None:
print('enter msg')
else:
say_hello(msg)
if __name__ == '__main__':
print('direct run')
main()
else:
print('import run')
exception
예외가 발생한 경우 후속 조치 등 대처가 필요하여 사용한다.
예상 가능한 예외와 예상이 불가능한 예외에 대처.
# try - except - else - finally
for i in range(10):
try:
result = 10 / i
except ZeroDivisionError as err:
print(err)
else: # error가 나지 않았을때 수행
print(result)
finally:
print("종료됨")
강제 예외처리 키워드 raise
raise <Exception Type>
사용자 정의 Exception
# 사용자 정의 Exception 클래스
# 음수값이 입력되었을 때 강제로 예외 발생
# 규칙: Exception을 상속받아야 한다.
class NegativePriceException(Exception):
def __init__(self):
print('price can not be Negative')
raise AttributeError
def calc_price(value):
price = value * 1000
if price < 0:
raise NegativePriceException
return price
print(calc_price(100))
print(calc_price(-100))
Logging
시점(level)마다 다른 Log가 남을 수 있도록 하는 용도
DEBUG > INFO > WARNING > ERROR > Critical
Level | 개요 | 예시 |
---|---|---|
debug | 개발시 처리 기록을 남겨야하는 로그 정보를 남김 | - 다음 함수로 A를 호출함, - 변수 A를 무엇으로 변경함 |
info | 처리가 진행되는 동안 정보를 알림 | - 서버가 시작되었음, - 서버가 종료됨, - 사용자 A가 프로그램에 접속함 |
warning | 사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않는 정보가 들어왔을 때 알림 | - Str 입력을 기대했으나, Int가 입력됨 -> Str casting 처리 |
error | 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작 할 수 있음을 알림 | - 파일에 기록을 해야하는데 파일이 없음--> Exception 처리후 사용자에게 알림, - 외부서비스와 연결 불가 |
critical | 잘못된 처리로 데이터 손실이나 더이상 프로그램이 동작할 수 없음을 알림 | - 잘못된 접근으로 해당 파일이 삭제됨, - 사용자에 의한 강제 종료 |
import logging
def say_hello(msg):
return 'hello ' + msg
# logging configure
# logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s -%(levelname)s - %(message)s')
logging.basicConfig(level=logging.INFO, format=' %(asctime)s -%(levelname)s - %(message)s')
logging.debug('start of program')
logging.debug(say_hello('debug mode'))
logging.info(say_hello('info mode'))
logging.debug('end of program')
logger를 통한 파일생성
import logging
def say_hello(msg):
return 'hello ' + msg
# create logger
root_logger = logging.getLogger()
# configure log level
root_logger.setLevel(logging.DEBUG)
# create logger file Handler
fileHandler = logging.FileHandler('test.log', 'w', 'utf-8')
# create logger console Handler
streamHandler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s -%(levelname)s - %(message)s')
file_formatter = logging.Formatter('%(asctime)s -%(levelname)s: %(filename)s: %(lineno)s - %(message)s')
# configure file_formatter to File Handler
fileHandler.setFormatter(file_formatter)
streamHandler.setFormatter(formatter)
# assignment logger obj to fileHandler and streamHandler
root_logger.addHandler(fileHandler)
root_logger.addHandler(streamHandler)
root_logger.debug('start of program')
root_logger.debug(say_hello('debug mode'))
root_logger.info(say_hello('info mode'))
# root_logger.warn(say_hello('warn mode')) #deprecated
root_logger.error(say_hello('error mode'))
root_logger.debug('end of program')
file read write
# default mode is 'r'
myfile = open('i_have_a_dream.txt')
contents = myfile.read()
print(contents)
myfile.close()
# with is read a line return List Type
with open('i_have_a_dream.txt', 'r') as my_file:
contents = my_file.read()
word_list = contents.split(' ')
line_list = contents.split('\n')
print('total number of characters: ', len(contents))
print('total number of words', len(word_list))
print('total number of lines', len(line_list))
# readline() 함수 사용
with open('i_have_a_dream.txt', 'r') as my_file:
# line number
i = 0
while True:
line = my_file.readline()
if line.strip() != '':
print(str(i) + '===' + line.strip())
if not line:
break
i += 1
# 'a' option is append
f = open('count_log.txt', 'w', encoding='utf-8')
for i in range(1, 11):
data = '%d번째 줄입니다.\n' % i
f.write(data)
f.close()
import os
if not os.path.isdir('log'):
os.mkdir('log')
with open('log/contents.txt', 'a') as a_f:
for i in range(100,111):
data = '%d번째 줄입니다. \n' %i
a_f.write(data)