#클래스
#: 반복되는 변수&메서드(함수)를 미리 정해놓은 틀(설계도)
#비슷한 기능의 함수를 여러번 작성해야할 번거움이 있을 때 사용
#계산기 +,-,*,/ 기능을 여러함수로 정하지 않고 클래스로 정의해서 찍어내면 된다.
"""
class FourCal: #class로 정의하면 대문자로 시작하는 클래스 이름을 적어준다.
pass #일단은 아무것도 안함
c1 = FourCal()
print(c1) #<__main__.FourCal object at 0x000000E929A02C08>
print(type(c1)) #<class '__main__.FourCal'>
"""
class FourCal:
def __init__(self, first, second): ##__(언더바2개) 함수는 특별한 기능이 있다. init는 클래스를 처음 만들어낼 때 처음으로 실행되는 함수다. 초기화 함수
self.first = first
self.second = second
def setdata(self, first, second):
self.first = first #클래스는 여러번 복제될 수 있는데 그 구분을 위해서 self는 인스턴스의 이름을 가지게 된다.
self.second = second
def add(self):
result = self.first + self.second
return result
def sub(self):
result = self.first - self.second
return result
def mul(self):
result = self.first * self.second
return result
def div(self):
result = self.first / self.second
return result
#c2 = FourCal() #__init__ 함수가 없을 때 사용, 클래스 할당됨, c2 이름이 클래스의 self 변수에 들어감. self = c2
#c2.setdata(2,3) #first = 2, second = 3
c2 = FourCal(2,3) #__init__ 함수 선언 후에는 할당할 때 매개변수 값을 적어줘야 애러가 안뜬다.
print(c2.first) #2
print(c2.second) #3
print(c2.add()) #5
#클래스 상속
#위에 부모 클래스를 상속받아서 기능을 확장
#class클래스이름(부모클래스 이름):
class MoreFourCal(FourCal): #FourCal 클래스를 상속
def pow(self):
result = self.first ** self.second
return result
c3 = MoreFourCal(6,8)
print(c3.add()) #14
print(c3.pow()) #1679616
#클래스 변형
#똑같은 함수가 부모와 자식클래스에서 중복이 되면 자식의 함수가 우선이 된다. "자식 이기는 부모 없다."
#부모 함수를 덮어쓴다 = 오버라이딩
class SafeFourCal(FourCal):
def div(self): #부모 클래스가 가지고 있는 div함수를 또 지정해줬다.
if self.second == 0: #0으로 나눌 수는 없으니
return 0
else:
return self.first / self.second
c4 = SafeFourCal(8,0)
print(c4.div()) #0
#c2.setdata(8,0)
#print(c2.div()) #애러가 뜬다
#클래스 변수, 객체 변수
#클래스 변수 : 클래스에 공통적으로 적용되는 변수, 객체를 생성해도 모두 같은 값을 가진다.
#객체 변수 : 객체마다 따른 값을 가지게 되는 변수
class FourCal1:
first = 2 #클래스변수
second = 3 #클래스변수
def __init__(self, first, second): #
self.first = first #객체변수
self.second = second #객체변수
#클래스 변수
class Family:
lastname = "김"
Family.lastname = "박"
print(Family.lastname) #박
c5 = Family()
c6 = Family()
print(c5.lastname) #박
print(c6.lastname) #박
#모듈
#미리 만들어 놓은 .py파일 (함수,변수,클래스)
#import 파일이름 #(확장자는 적지않는다.)
import mod1
#모듈에서 전부 가져오기는 싫고 필요한 일부분만 가져오고 싶을 때는
#from 파일이름 import 함수이름
from mod1 import add
#모듈을 import 하면서 모듈 파일을 실행하게 되는데 그 과정에서 불필요하게 print()함수가 있어서 출력이 되는 경우가 있다.
#이 부분을 보완하려면 printf()함수 위에
#if __name__ == "__main__":
#이 내용을 적어주고 print()함수는 들여쓰기 해주면 된다.
#
#if __name__ == "__main__":
#__name__은 진짜 실행하는 함수의 이름??을 뜻한다.
#모듈파일에서 직접 실행을 하면 main에서 실행이 되는 것이기 때문에 if문 내용이 실행이 되지만
#모듈로 불어오게 되면 __name__변수에 모듈이름이 들어가기 때문에 import를 했을 때는 if문이 실행되지 않는다.
#그래서 print()함수의 내용이 출력되지 않는다.
"""
#mod1.py 파일내용
def add(a,b):
return a+b
if __name__ == "__main__":
print(add(2,4))
print(add(6,3))
#print(__name__) #__name__ 변수 값 확인을 위해서 적어둠
"""
#모듈이 하위폴더에 있을 때 import하는 방법
import sys #sys
sys.path.append("F:\\python\\modules") #경로지정 디렉토리 구분은 \\ 역슬레시2개
import mod2 #파일 이름으로 import
print(mod2.add(4,7)) #11
#패키지 (라이브러리)
#모듈 여러 개를 모아놓은 것
"""
가상의 게임 패키지 예)
game/
__init__.py #패키지를 표현하는 파이썬 파일, 패키지 관련 설정을 하는 파일
sound/
__init__.py
echo.py
graphic/
__init__.py
render.py
"""
"""
#패키지 접근방법
import game.sound.echo #팩키지인데 폴더라서 하나씩 들어가야 한다. game안에sound안에echo로 접근, 폴더 구분은 .(마침표)로 한다.
game.sound.echo.echo_test() #함수 접근방법
#이렇게 해도 된다.
from game.sound import echo
echo.echo_test()
#요렇게도 가능
from game.soud.echo import echo_test
echo_test()
#더 간단하게도 가능
from game.soud.echo import echo_test as e #as는 별칭을 붙여준다는 의미.
e()
#ALL *
from game.soud import * #* = 모든 것. sound폴더에 있는 모든 걸 불러와라
echo.echo_test()
#이 상태로는 애러가 뜬다.
#sound폴더 안에 __init__.py파일을 열어서 내용을 좀 수정해줘야 하는데
#__all__ = ['echo','echo2']
#이렇게 __all__ 변수에 echo를 넣어줘야 * 별표로 불러왔을 때 사용이 가능하다.
#relative 패키지
#game.graphic폴더에서 game.sound에 모듈을 불러오고 싶을 때
#..(점2개)를 찍으면 이전폴더,상위폴더로 돌아간다는 의미
from ..sound.echo import echo_test
"""
#예외처리
#오류가 발생하면 프로그램은 종료된다.
#예외처리를 미리 만들어 두면 어떻게 처리되어 넘어갈 수 있게 만들 수 있다.
#try~except가 기본구조임
"""
try:
#오류가 발생할 수 있는 구문
except Exception as e:
#오류발생
else:
#오류 발생하지 않음
finally:
#무조건 마지막에 실행
"""
try:
4/0
except ZeroDivisionError as e: #애러 내용이 e변수에 저장됨
print(e) #division by zero
print("오류가 나더라도 프로그램이 종료되지 않고 아랫부분이 실행됨")
#try~else
#try에서 애러가 없을 때 else를 실행해라
try:
f = open('none', 'r')
except FileNotFoundError as e:
print(str(e))
else:
data = f.read()
print(data)
f.close()
#try~filnally
#finally : 오류가 있든없든 무조건 마지막에 실행되는 부분
f = open('text.txt', 'r')
try:
data = f.read()
print(data)
except Exception as e: #Exception : 구체적인 오류가 아니라 그 어떠한 오류가 발생하더라고 걸림. 최상위 부모격이라 모든 오류도 잡음
print(e)
finally:
f.close()
#여러개의 오류 처리하기
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")
#오류 회피하기
#except에 pass를 적어주면 된다.
try:
f = open("none",'r')
except FileNotFoundError:
pass
#오류 일부러 발생시키기
#raise NotImplementedError
#자식 클래스에 부모의 메소드를 덮어씌우면 자식의 메소드가 우선시된다.
#부모 클래스에서 기능은 만들었지만 자식클래스에서 변형해서 쓰기를 원할 때 사용
#만약 변형해서 쓰지 않는다면 애러가 뜨게 하는 코드이다.
#프로그래머 입장에서 강제로 변형해서 쓰라고 알려주는 경고문(?)
#다른 오류명을 넣으면 그 오류명이 뜬다.
class Bird:
def fly(self):
raise NotImplementedError #이 부분이 실행되면 오류가 발생한다.
class Eagle(Bird):
def fly(self):
print("very fast")
eagle = Eagle()
eagle.fly()
[파이썬] DART 전자공시 API 사용방법(XML) - 인증,기업공시 검색까지 정리 (0) | 2020.08.18 |
---|---|
[파이썬] 내장함수, 외장함수 (유튜브 보다가 메모) (0) | 2020.08.18 |
[파이썬] 함수, 사용자입출력, 파일입출력 (유튜브 보다가 메모) (0) | 2020.08.17 |
[파이썬] 제어문 (조건문 if문, 반복문 while문 for문) 유튜브 보면서 메모.. (0) | 2020.08.17 |
[파이썬] 자료형2, 튜플,딕셔너리, 집합, 불, 변수와 메모리, 변수 만드는 방법 (유튜브 보면서 메모) (0) | 2020.08.17 |