Python 95

GitHub를 통한 패키지 배포

- 개요이전에 만든 커스텀 패키지는 PyPI를 통해 설치할 수 있었다이번에는 GitHub Repository에 패키지 파일을 Push하고 해당 파일을 통해 패키지를 설치하는 방법을 알아본다 - 패키지 Push1) 기본적인 설정을 완료한 패키지 폴더의 디렉토리에 git을 설치 2) 패키지 폴더를 GitHub Repository에 Push 위와 같은 절차를 거쳐서 리포지터리에 패키지 폴더를 Push한다각각의 과정은 간단하게 다음과 같다 add : 변경된 파일을 중간 단계인 스테이징 영역에 스테이징commit : 스테이징 영역의 변경 사항 커밋(저장)remote add origin : 로컬 저장소에 origin이라는 이름의 원격 저장소(GitHub Repo)를 추가push origin : 원격 저장소(G..

PyPI를 통한 배포 (2)

- 개요패키지를 구성하는 파일들의 설정을 알아보았으므로 본격적인 패키징을 수행한다패키징을 수행한 후에 실제 PyPI 사이트에서 패키징된 결과를 확인하고 import하여 사용한다 - 패키징 절차1) 패키징할 폴더의 위치에 setuptools 플러그인과 wheel 플러그인을 설치이때 가상환경에서 작업을 하는지 / 가상환경에서 작업을 하지 않는지에 따라 다르게 수행한다전자의 경우 설치 방법 : python -m pip install --upgrade setuptools wheel후자의 경우 설치 방법 : python -m pip install --user --upgrade setuptools wheel2) setup.py 파일의 디렉토리에서 실행하여 패키지 빌드 : python setup.py sdist bd..

PyPI를 통한 배포 (1)

- 개요파이썬에서 패키지를 배포하기 위해서 사용하는 여러 방법 중에서 PyPI를 사용하는 방법을 알아본다Python Package Index(PYPI)는 파이썬을 위한 오픈소스 패키지 저장소로서PyPI에 배포된 패키지는 pip 명령어를 통해 설치할 수 있다 따라서 PYPI를 통해 패키지를 배포하기 위해 필요한 요소들을 알아보고또 다른 로컬 모듈에서 작성한 클래스(기능)를 import하는 방법도 알아본다 1) 다른 로컬 모듈의 클래스를 import하는 방법from PythonAdvanced_04_02 import GIFGenerator as gfg# 클래스 생성g = gfg(inputPath='./project/images/*.png', outputPath='./project/image_out/result..

오픈소스 배포 프로젝트 - 2) 커스텀 패키지 (2)

- 개요커스텀 패키지 (1)에서 만든 스크립트를 클래스 형태로 전환하여 사용성을 높인다생성할 클래스의 구조는 다음과 같다__init__ 메서드 : 총 3개의 인자를 받는데, 이미지들의 경로 / 최종 GIF 파일의 경로 / 이미지 사이즈로 구성generate_gif 메서드 : GIF 파일을 생성하되, 이전과 다르게 예외처리 기능을 추가 - 스크립트import globfrom PIL import Imageclass GIFGenerator: def __init__(self, inputPath=None, outputPath=None, imgSize=(320, 240)): self.inputPath = inputPath or './*png' self.outputPath = outpu..

오픈소스 배포 프로젝트 - 1) 커스텀 패키지 (1)

- 개요본격적으로 파이썬의 커스텀 패키지를 만들고 해당 패키지를 오픈소스 방식으로 배포한다생성할 패키지는 여러개의 이미지를 하나의 GIF로 만들어주는 기능을 수행한다 우선 패키지로 만들기 이전에 구성하는 스크립트를 작성한다해당 스크립트에서 사용하는 모듈은 다음과 같다glob : 디렉토리에 대한 접근을 용이하게 만들어주는 모듈PIL 라이브러리의 Image 모듈 : 사진 파일 및 GIF 파일을 다루기 위한 모듈 - 스크립트 구성import globfrom PIL import Image# GIF 파일에서 사용할 이미지들의 경로와 GIF 파일의 생성 경로path_in = './project/images/*.png'path_out = './project/image_out/result.gif'# GIF 파일의 대표..

Descriptor (2)

- 개요Descriptor와 Property의 차이점은 다음과 같다Descriptor : get / set과 같은 데이터 조작 함수의 기능을 확장Property : 어노테이션등을 통한 데이터 조작 함수의 정의 따라서 단순한 기능을 제공하는 Property와 다르게 Descriptor를 사용하면 많은 장점을 얻을 수 있다1) 상황에 맞는 메서드 구현을 통한 OOP 구현2) Property와는 다르게 재사용이 가능함3) ORM Framework(객체-관계 매핑) 사용 1) Descriptor 사용 예제 (1)class DirectoryFileCount: def __get__(self, obj, objtype=None): print(os.listdir((obj.dirname))) ..

Descriptor (1)

- 개요Descriptor는 객체(클래스)안에서 다른 객체(클래스)를 속성으로 갖고 있는 형태를 의미한다get, set, delete와 같은 데이터 조작 함수를 미리 정의할 수 있다는 이점을 갖고 있다데이터를 수정하는 경우를 Data Descriptor, 데이터를 수정하지 않는 경우를 Non Data Descriptor라고 부른다 Descriptor를 사용하면 의도하는 방향으로 클래스를 생성할 수 있다클래스를 생성하는 방법은 다음의 2가지 방법으로 이뤄진다property 클래스를 사용하지 않고 Descriptor 클래스를 정의하는 방식property 클래스를 사용하여 Descriptor 클래스를 정의하는 방식전자의 방식을 사용하는 경우 정해진 규격에 맞춰 함수를 정의해야 하지만,후자의 방식을 사용하면 원..

메타 클래스 (3)

- 개요파이썬에서 메타 클래스는 설계자가 정의한 방식으로 동작하므로 클래스를 유연하게 사용할 수 있다파이썬에서 메타 클래스를 만드는 방식은 다음과 같이 구분할 수 있다type 함수를 사용하여 정의하는 방식type 메타 클래스를 상속받아 정의하는 방식 type 함수를 사용하여 메타 클래스를 정의하는 경우 사용방법이 간단하다는 장점이 있지만,인스턴스의 생성 -> 초기화 -> 호출까지의 과정은 확장할 수 없다는 단점이 있다 반대로 type 클래스를 상속받아 메타 클래스를 정의하는 방법은 많이 복잡하지만,__new__ , __init__, __call__ 메서드를 오버라이드하여 인스턴스에 대한 과정을 확장할 수 있다 1) type 함수를 사용한 메타 클래스 생성def custom_multiple(self, d..

메타 클래스 (2)

- 개요type 함수를 호출하여 메타 클래스를 사용하면 사용자가 설계한 방식으로 동작하는 동적 클래스를 생성할 수 있다이때 생성하기 위해 사용하는 인자는 다음과 같다Name : 동적으로 생성할 클래스 이름Bases : 동적으로 생성할 클래스가 상속받을 클래스들, 튜플로 지정한다Dct : 동적으로 생성할 클래스의 어트리뷰트와 메서드들, 딕셔너리로 지정한다 위와 같이 메타 클래스를 통해 생성한 동적 클래스들은 사용자가 정의한 방식으로 동작하므로필요한 기능만을 가져와 사용하는 라이브러리와 다르게 고유한 동작흐름이 있는 프레임워크에서 매우 유리하다 1) 동적 클래스의 생성s1 = type('SampleA', (), {})print(s1) print(type(s1)) print(s1._..

메타 클래스 (1)

- 개요객체지향 언어인 파이썬에서는 다른 객체지향 언어와 다르게 클래스 그 자체도 객체로 취급한다따라서 클래스 역시 객체이므로 클래스를 생성하는 클래스 역시 존재한다클래스를 생성하는 클래스를 메타 클래스라고 부르고 type() 함수가 대표적인 메타 클래스이다 메타 클래스를 사용하여 얻을 수 있는 가장 큰 이점은 커스텀 메타 클래스를 만들 수 있다는 점이다 커스텀 메타 클래스를 활용하여 원하는 방향으로 클래스를 생성할 수 있다함수 오버로드나 검증 로직과 같은 확장 기능을 클래스에 부여할 수 있다 1) 인스턴스, 클래스, 메타 클래스 순서로 접근class SampleA(): passobj = SampleA()print(f"__class__ 메서드를 사용하여 인스턴스로부터 클래스 타입 판별 : {obj...