본문 바로가기
Python

[파이썬] 추상*****

by AI미남홀란드 2021. 1. 23.
728x90

추상(abstract) : 내용이 없는 이름만 존재하는

 

고객의 요구사항 ? 구현? 

 

 

                                  | 메뉴판

고객의 요구사항 <--> 모형 <--> 구현 

=> 인터페이스라고도 얘기하고 , Protocol(규칙 , 규약)

 

ex) 식당에 갔는데 , 메뉴판에 메뉴가 없다? 메뉴는 약속이다.

 

개발자가 되기 위해서는 습관화가 되어야 한다.

중견 기업이나 면접을 보러갈땐 오버라이딩 , 추상 등을 익혀야 함

 


=> abstract class & abstract method

abstract class 는 인스턴스를 만들 수 없는 클래스 - 상속을 통해서만 사용 합니다.

- abstract method는 내용이 없는 메소드 - 하위 클래스에서 반드시 내용을 구현해야 하는 메소드 , 반드시 구현해야 한다고 해서 protocol 이라고 하기도 하고 , interface 라고 부르기도 합니다.

 

고객의 프로그램을 만들 때 abstract class 를 이용해서 템플릿을 만들고 실제 구현이 abstract class 를 상속받은 클래스에서 하게 됩니다.

이러한 패턴을 템플릿 메소드 패턴이라고 합니다.

 

추상클래스를 만들 때는 class 클래스이름(metaclass=abcmeta): 이렇게 해줘야 하고 추상 메소드를 만들 때는 상단에 @abstractmethod

라고 추가하면 됩니다

 

abc 모듈의 abstractmethod 와 ABCMeta 를 import 해야 합니다.

 

from abc import abcstractmethod

from abc import ABCMeta

 

class Menu(metaclass=ABCMeta):

@abstractmethod

            def softtofu(self):
              pass

 

#추상 클래스를 상속받은 클래스

class KoreaFoodHous(Menu):

         def softtofu(self):

                print("두부를 이용한 찌개")

obj = KoreadFoodHouse()

obj.softtofu()

 

=> Delegation (위임)

화면에 보여지는 객체 (뷰)에 발생하는 이벤트를 자신이 처리하지 않고 다른객체에게 넘겨서 처리하는 것

 

파이썬에서는 인스턴스가 소유하고 있지 않은 메소드를 호출할 때 대신호출되는 메소드를 Delegation 이라고 합니다.

def __getatter__(self, name) 의 형태로 만들어야 합니다.

 

name은 메소드 이름입니다.

 

* 클래스 만드는 것보다 클래스를 사용하는 것이 중요

 

class Delegation:

     def display(self):

        print("화면출력")

 

delegation=Delegation()

delegation.display()

delegation.print() <-- x틀린 것 임 에러 의 예시

# attributeError : 인스턴스가 가지지 않은 속성이나 메소드를 호출 한 것
#이름은 맞다면 인스턴스를 만들때 클래스 이름을 정확하게 썼나 확인!

# TypeError : 2가지 경우다. 메소드를 호출 할 때 필요한 데이터를 안 준것은 아닌지 확인하고

# 잘못된 데이터를 입력하는 경우이다. 숫자를 대입하는데 문자를 대입한 경우

# 문자를 대입해야하는데 숫자를 대입한 경우 help 이용해서 확인 해야 합니다

 

# 이 메소드를 만들면 메소드를 호출해도 에러가 나지 않고
 # 대신 이메소드가 호출됩니다
     def __getattribute__(self, name):
         print(name,'은 없는 메소드 입니다.')

 

(나야 물론 흩겨들은 자료구조의 지식이 있는데 , 기본적으로 처음 코딩 독학하는 분들이 계신다면 '자료구조'를 보시면 좋습니다.

처음에 저도 0 과 1 왜 첫번째가 0번째 자리지 막 헷갈리고 욕도나왔는데 봐줘야합니다 ㅜ.ㅠ)

 


 

li= [100,200,300]           li : 2000번지      

100
200
300

 

li[0]=100

li[1]=200

li[2]=300

 li[3] = 300 (X) // 0번지 부터

 

iterator(반복자)

-> for를 이용해서 데이터의 모임을 빠르게 접근할 수 있도록 해주는 것 

*** 

for 임시변수 in 데이터의 모임:

          데이터의 모임을 순회하면서 수행할 작업

***

데이터의 모임의 데이터들이 순서대로 임시변수에 대입되서 작업을 수행한다.

 

__iter__ 가 구현된 인스턴스만 사용할 수 있습니다.

 

lli = ['python','r','c','c++']

for i in li:
    print(i)


결과 : python

           r

          c

          c++

print(dir(li)) li가 가진 모든 요소를 확인 해주는 명령어

__iter__ 가 있는 것을 확인할 수 있다.

이 친구가 있어서 저렇게 출력이 가능하다.

 

 msg = 'python' 
    for i in msg:
        print(i)
    
    idx = 100
    for i in idx:
        print(i)

 

출력결과 : 오류가 뜬다 

why? idx에는 __iter__가 존재하지 않고 위 구문인 msg에는 존재한다.

dir(msg)로 확인해보면 된다.

   #__add__: +
    #__sub__: -
    #__mul__: *
    #__eq__: *
    #__ne__:!=
    #__gt__:>
    #__gte__:>
    #__it__:<
    #__ite__:<=

 

=> geterator 

iterator 의 특수한 형태로 함수를 만들고 yield 데이터를 작성하면 for 를 이용하면 yield 뒤에 있는 데이터가 순서대로 리턴됩니다.

=> coroutine

응용 프로그램 만드는 작업 그 중에서도 빅데이터 처리쪽을 하는 경우에 살펴보시면 됩니다

함수 수행 중에 다른 함수로 제어권을 이동했다가 다시 돌아올 수 있도록 만드는 것

 

=> decorator

@명령어 를 이용해서 특별한 기능을 사용하는 것

우리가 작성할 때는 @명령어로 입력하지만 실행이 될 때 실제 코드를 가져와서 실행합니다.

웹프로그래밍할 때 많이 사용됩니다.

 

***** 모듈 과 패키지

1. Module

-> 독립적인 실행 가능한 코드의 모임 (프로그래머의 입장)

-> 파이썬에서는 하나의 파일이 모듈

-> 3rd party 모듈 : 파이썬 재단이나 사용자가 아닌 다른 사람들이 만들어서 제공하는 모듈

-> 파이썬에서는 현재 실행 중인 파일을 main 모듈이라고 합니다.

 

2) 다른 모듈을 사용하는 방법

math 라는 모듈이 있고 그 안에  PI 와 cos() 라는 함수가 존재하는 경우

=> import 모듈이름 : 모듈에 작성된 모든 것을 모듈이름으로 가져온것입니다.

import math : math.PI , math.cos() 형태로 사용합니다.

=> from 모듈이름 import 속성이름이나 함수 나열 : 모듈에 존재하는 것 중에서 나열된 것만

현재 모듈에 포함시킵니다

 

from math import PI : PI로 사용합니다

=> from 모듈이름 import * : 모듈의 모든 것을 현재 모듈에 포함시킵니다

 

from  math import * : PI , cos() 형태로 사용합니다.

=> import 모듈이름 as 별명 : 모듈을 별명으로 가져옵니다.

import pandas as pd.  pandas 라는 모듈을 pd 라는  이름으로 사용합니다.

import numpy as np : numpy 라는 모듈을 np라는 이름으로 사용합니다.

=> from 모듈이름 Import 속성이름이나 메소드이름 as 별명

 

3) 모듈을 찾는 순서

# 모듈을 찾는 순서를 확인

import sys

for path in sys.path

     print(path)

 

4) 모듈을 찾는 위치를 추가

=> 프로그램 내에서 추가

import sys

sys.path.append('검색할 경로')

 

-> 환경 설정을 이용

PYTHONPATH = 검색경로

 

mypi = 3.14
def area(r):
    print(r * r * mypi)

 

메모장에 pythom.py로 저장후 

불러올때는

sys.path.append('저장경로')

 

2.패키지

=> 모듈을 모아놓은 디렉토리와 비슷한 개념

=> 파이썬에 배포를 하거나 설치를 할 때는 패키지 단위로 해야 합니다.

=> 디렉토리가 패키지 될려면 디렉토리 안에 __init__.py 파일이 있어야 함

내용은 상관 없다

1) 패키지가 설치되는 디렉토리 확인

import sys

sys.path

 

=> 이 명령을 사용하는 자신의 컴퓨터에 파이썬이 2가지 버전 이상이 설치되었거나 가상환경을 만들어서 실행하는 경우

확인합니다.

 

2) 패키지 안에 __main__.py 를 만들면 터미널에서 Python 하고 디렉토리 이름을 입력하면 __main__.py 파일이 실행됩니다

__main__.py 파일이 실행됩니다.

 

pip install 외부모듈이름 

=> 외부 모듈 이름 뒤에 -upgrade 를 추가하면 기존의 모듈이 업데이트 됩니다.

=버전을 추가하면 버전이 설치됩니다.

>=버전의 형태로도 설정 가능

 

=> 최신 버전의 모듈을 설치하려고 하면 pip 를 업그레이드 하라는 메시지가 출력되기도 합니다.

python -m pip install --upgrade pip

 

=> 자신에게 설치된 패키지 확인

pip list --format=coloms

 

=> 패키지 삭제

pip uninstall 패키지 이름 -y

=> 폐쇄망에서 인터넷에서 다운로드가 안되는 경우가 있습니다.

다른 곳에서 pip download 패키지이름 으로 다운로드를 받아서 컴퓨터에 복사한 후 pip install 패키지파일 이름을  입력해야 합니다.

 

실습 1: 현재 컴퓨터에 설치된 패키지 확인

 pip list -- format=columns

cmd 창에서 입력하면  패키지 이름과 버전이 뜬다

 

실습 2: 다른 패키지를 이용해서 그래프를 출력

=> mataplotlib 패키지의 pyplot 이라는 모듈을 이용합니다.

figure(figsize=(가로너비 , 세로너비)) 를 호출해서 그래프를 그릴 영역을 만듭니다.

 

그래프 ( 데이터 나열 ) 를 호출하면 그래프가 그려집니다.

 

show() 를 호출하면 화면에 출력됩니다.

 

save를 호출하면 파일로 저장됩니다.

 

* 그래프 만들기 *

import matplotlib.pyplot as plt

#그래프 크기 설정

fig = plt.figure(figsize=(10,5))

#그래프 그리기

plt.boxplot(([100,89,29,10,28],[10,30,90,23,16]))

#화면에 출력

plt.show()

#파일에 저장

fig.savefig('graph.png')

 

실습3 ) 지도 만들기

 

mport folium

m = folium.map(lacation=[37.572565, 126.973304],zoom_start=15)

 

m.save('map.html')

경로에 저장된 map.html 을 눌러보면 화면이 출력된다.

 

 

728x90

'Python' 카테고리의 다른 글

[파이썬] 파이썬 정리2  (0) 2021.01.24
[파이썬] 파이썬의 정리  (0) 2021.01.23
[파이썬] 상속  (0) 2021.01.23
[파이썬] 상속  (0) 2021.01.17
[파이썬] 클래스 객체 지향 프로그래밍  (0) 2021.01.17