끄적끄적

반응형

#클래스

#: 반복되는 변수&메서드(함수)를 미리 정해놓은 틀(설계도)

#비슷한 기능의 함수를 여러번 작성해야할 번거움이 있을 때 사용

#계산기 +,-,*,/ 기능을 여러함수로 정하지 않고 클래스로 정의해서 찍어내면 된다.

"""

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()



반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]