Python < Replit 정리 55 - 58 >

do yeon kim·2022년 6월 23일
0

Python

55. Class

클래스

클래스는 같은 특징을 가진 대상들을 모아 둔 것이다.

위의 사진에서 보면 comedian은 class 이고 사람은 object가 된다.
class는 큰 개념이고, object가 실제하는 대상이 된다.

많이 언급되는 예로 붕어빵과 붕어빵 틀이 있다.
붕어빵을 만드는 틀은 클래스에 해당하며, 실제 만들어진 붕어빵은 객체가 된다.

클래스에는 속성과 메서드가 있다.
속성은 클래스의 특징을 의미하며, 메서드는 클래스의 동작을 의미한다.

차라는 클래스를 만든다고 가정해보자.
차의 속성으로는 모델, 가격, 탑승인원, 출시년도 등 다양한 속성이 있다.
차의 메서드로는 앞으로 가기, 멈추기, 뒤로가기, 경적울리기 등 다양한 메서드가 있다.


class Car:
	def __int__(self, model, price, people_limit....)
    	self.model = model
        self.price = price
        self.people_limit = people_limit
    
    def go(self)
    	pass
    
    def back(self)
    	pass
    
    def sound(self)
    	pass

위의 코드는 Car클래스를 구현해 본것이다.

생성자

def __init__(self.....)

클래스 생성시 반드시 필요한 생성자이다. 생성자는 클래스로 부터 객체를 만들 때 객체의 초기값을 주는 것과 같다.

self

모든 메서드에는 self라는 키워드가 들어간다.
self는 자기자신을 의미하며, class로 부터 만들어지는 객체 자기자신을 의미한다.
class내의 모든 메서드의 첫번째 파라미터는 self이다.

사용이유

클래스를 사용하면 코드의 구조를 더 효과적으로 구현할 수 있다.
이렇게 클래스를 위주로 구현하는 프로그램을 Object Oriented Programming(객체 지향 프로그래밍)이라고 한다.

클래스, 객체, 인스턴스

클래스(class)로 부터 만들어지는 실체(instance) 들을 객체(object) 라고 한다.

실체 (instanace) 는 이영자, 송영이, 양세형, 유병재입니다.

이 실체(instance)들을 object(객체) 라고 합니다.



class Database:
  def __init__(self, name, size):
    self.name = name
    self.size = size
    self.dict = {}

  def insert(self, field, value):
    if self.size > len(self.dict):
      if field in self.dict.keys():
        self.dict[field] = value
      else:
        self.dict[field] = value
    else:
      pass

  def select(self, field):
    # for i in self.dict.keys():
    #   if field == i:
    #     result = self.dict[i]
    
    # if field not in self.dict.keys():
    #   result = None
    # print(result)
    if len(self.dict) > 0:
      if field in self.dict.keys():
        return self.dict[field]
      else:
        return None
    else:
      pass
      
  def update(self, field, value):
    if len(self.dict) > 0:
      if field in self.dict.keys():
        self.dict[field] = value
      else:
        pass
    else:
      pass

  def delete(self, field):
    if len(self.dict) > 0:
      if field in self.dict.keys():
        del self.dict[field]
      else:
        pass
    else:
      pass
      

56. Modules & Packages

모듈
모듈이란 변수나 함수 그리고 클래스를 모아 놓은 파일이다.
다른파일에서 재사용이 가능하다.

모듈의 생성
.py 파일은 모듈로서 재사용 가능하다.


모듈호출방법
import myModules문 사용하기

Alternative ways to import modules

from ~~ import~~문 사용하기

별명붙히기

from ~~ imort ~~ as a
a라는 별명을 붙혀서 사용할 수 있다.

Packages

패키지는 모듈보다 좀 더 큰 개념이다.
같은 종류의 모듈들이 모여서 하나의 패키지가 이루어진다.



57. How import statement finds modules and packages

파이썬에서 module와 package를 어떻게 찾을까?



import를 한다고 하면 순서대로 돌아가면서 package위치를 찾는다.
파이썬은 다음 3가지 장소를 순서대로 보면서 찾습니다.

    1. sys.modules
    1. built-in modules
    1. sys.path



sys.modules
모듈이나 package를 찾기 위해 가장 먼저 확인하는 곳이다.
sys.modules은 단순한 디랙토리이다. 이미 import한 모듈과 package들을 저장하고 있다.

한번 import한 모듈과 패키지들을 다시 찾지 않아도 되게 한다.

그러므로 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없습니다.



built-in modules

파이썬에서 제공하는 라이브러리로 파이썬에 포함되어 있으므로 쉽게 찾을 수 있다.



sys.path
마지막으로 보는 곳이다. 리스트로 되어 문자열들을 가지고 있다.
파이썬이 리스트를 하나씩 보면서 import하는 것이 있는지 확인한다.

sys.modules sys.path 둘다 sys를 사용한다. sys는 파이썬에 포함되어 있는 모듈로 출력및 수정이 가능하다.

위의 과정을 정리해보면, 먼저 import하고자하는 모듈과 패키지를 찾을 때 sys.modules에서 저장되어 있는지 확인, 없으면 파이썬의 내장모듈을 보는
built-in modules에서 확인 후 마지막으로 리스트 형태로 되어 있는 sys.path을 확인한다.

만약 이렇게 해서 찾지 못하면, ModuleNotFoundError 리턴한다.



Absolute Path & Relative Path

built-in modules인 모듈과 pip 모듈은 찾기가 어렵지 않다.
built-in modulesdms 위에서 설명한 데로 내장모듈이므로 쉽게 찾고,
pip모듈도 site-packages 는 sys.path에 이미 저장 됨으로 찾기 어렵지 않다.

어려운 것은 직접 개발한 local package이다.
local package를 사용하기 위해서는 경로를 잘 설정 해야한다.
local package를 import하는 방법은 absolute path 와 relative path가 있다.

absolute path은 절대경로를 의미한다.
import하는 파일이나 경로에 상관없이 항상 동일하다.

최상위폴더부터 하나씩 내려가면서 원하는 데이터에 접근하다.
from my_app.package1.module1 import function

어디서든 위와 같이 경로가 변경되지 않는다고 해서 절대경로라고 한다.
디렉토리의 주소형식과 같다. 어디안에 뭐가 있고, 어디안에 뭐가 있다. 식으로 데이터를 찾아 간다.

절대경로의 단점은 경로가 길어진다는 점이다.

이런 점을 보안 한것이 Relative Path 상대경로이다.

Relative Path는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의한
다.

relative path는 local package 안에서 다른 local package를 import 할때 사용한다.

Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있다
그러므로 웬만한 경우 absolute path를 사용하는게 권장된다.



정리1

sys.modules 와 sys.path의 차이점을 서술해 주세요.

sys.modules은 import를 할 경우 위치를 찾을 때 제일 먼저 찾는 곳으로, 이미 import한 모듈과 package가 저장되어 있다.

sys.path은 제일 마지막에 확인 하는 곳으로 리스트형태의 문자열로 저장되어 있다. 이곳에서 찾지 못하면 더 이상 찾지 않고 에러를 발생시킨다.



정리2

sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

sys는 파이썬에 이미 있는 모듈로 built-in modules에서 찾을 수 있을 것이다.



정리3

Absolute path와 relative path의 차이점을 서술해 주세요.
Absolute path은 절대 경로를 의미하며, 디렉토리의 위치를 나타내는 것처럼 최상위 부터 하나 하나, 하위로 내려가면서 위치를 특정한다. 어디서 사용하던, 같은 경로를 이용한 다는 점에서 절대경로라고 한다.
하지만 절대경로는 모든 디렉토리의 경로를 사용하므로 경로의 길이가 길어진다는 단점이 있다.

Relative path은 경로가 긴 Absolute path의 단점을 해결하고자 해서 나온 방법으로 절대경로와 같이 최상위 디렉토리부터 찾는 것이 아니라,
import하려는 경로부터 시작해서 찾아 간다.



정리4

calculator 패키지 만들기





정리5

상대경로로 접근하려고 할때 오류 발생

ImportError: attempted relative import with no knownparent package

python interpreter는 relative import의 module 위치를 정할 때 즉, 기준이 되는 모듈의 위치를 정할 때 __name__속성에 의해 결정됩니다.
__main__이라는 모듈의 위치를 파이썬 interpreter는 알 수가 없기 때문에 에러가 발생합니다.

해결방안
절대경로를 이용해서 접근한다.



정리6

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.



절대경로로 실행한 경우의 에러코드
No module named 'calculator'

절대경로는 최상위부터 보면서 내려온다. 그런데 calcultor라는 또다른 모듈을 찾기 때문에 오류가 발생한다.
절대경로는 최상위에서 찾는다. 그런데 다시 calculator를 해주면 calculator 안의 culculator을 다시 찾는다. 그래서 오류가 난다.

정리7

__init__.py 파일의 역할에 대해서도 정리해서 블로깅 해주세요.

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. __init__.py 파일이 없다면 패키지로 인식되지 않는다.

특정 디렉터리의 모듈을 *를 사용하여 import할 때에는 다음과 같이 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.

그렇지 않으면 *에 해당하는 모든 모듈을 import 해오지 않는다.



58. Exceptions

에러가 발생했을때를 예외상황이라고 한다.

예외상황이 발생했을 때를 Exceptions이 발생했다고 한다.

Exceptions이 발생하게 되면 뒤에 코드가 남았을 경우라도 프로그램이 비정상 종료하게 된다.

Exceptions이 발생해도 비정상종료를 하지 않게 하기 위해서는 예외처리가 필요하다. 예외가 발생했을 경우 비정상종료를 피하고 다른 로직을 실행하게 한다.

try:
     문장1
     문장2
     ...
     문장N    
except Exception:
     exception이 났을 경우 실행할 예외 처리코드
finally:
     Exception 여부와 상관없이 항상 마지막에 실행되는 코드

0개의 댓글