파이썬 49

Python _ Protocol로 인터페이스 만드는 방법

Python에서 인터페이스를 구현하는 방법에는 여러 가지가 있지만 이번 글에서는 Protocol을 이용한 방법을 소개한다. 인터페이스란? 쉽게 말해 외부와 소통하기 위해 필요한 메서드를 정의한것이다. 하위 모듈들은 해당 인터페이스에 맞춰 기능을 구현한다. Protocol 사용법 아래 코드를 보자. from typing import Protocol class 감정(Protocol): def 기쁘다(self) -> str: ... def 슬프다(self) -> str: ... class 사람: def 기쁘다(self) -> str: return "기뻐!" def 화나다(self) -> str: return "화나!" class 사회생활: def 시작(self, 사람: 감정) -> None: self.사람 =..

모노스테이트, 메타클래스, 싱글톤 구현예시

모노스테이트 싱글톤 패턴 The Monostate Singleton Pattern 객체 생성여부 보다는 상태와 행위에 초점을 맞춘 패턴 단일 객체가 아닌, 모든 객체가 같은 상태를 공유하는 패턴 __init__ 으로 구현 하는 방법 # __init__ 으로 구현하는 방법 class Mono: __shared_state = {"공유":"데이터"} def __init__(self): self.data = 1 self.__dict__ = self.__shared_state pass obj = Mono() obj.data = 9999 other_obj = Mono() print(f"{obj=}") print(f"{other_obj=}") """ 결과값. 서로 다른 인스턴스임을 확인할 수 있음 obj= other..

디자인 패턴 개요

객체지향 프로그래밍 파이썬의 모든 것은 객체다. → 파이썬의 클래스 인스턴스, 변수는 개별적인 메모리 공간에 저장된다. 객체 프로그램 내의 개체(entity)를 의미 개체는 다른 개체와 상호작용을 통해 목적 달성 클래스 속성(데이터)과 행동을 포함하는 객체를 정의 생성자로 객체 초기 상태 설정 일종의 템플릿으로 재사용 용이 메소드 객체의 행위를 의미 속성을 조작하고 작업을 수행 객체지향 프로그래밍의 주요 기능 캡슐화 객체의 기능과 상태를 숨김 클라이언트는 객체 구조와 상태를 직접 수정할 수 없고, 대신 수정을 요청 요청 종류에 따라 get, set 같은 특수 함수를 사용하여 내부 상태 변경 파이썬에서는 사실상 캡슐화 개념이 없지만 앞에 _를 붙여 접근 제한을 명시 다형성 객체는 함수 인자에 따라 다른 기..

js로 숫자 맞추기 게임을 만들어 배포하였다.

일주일 동안 기업과제에 묶여있어서 문제를 해결하느라 블로그를 소홀히 하였다. 기복없는 개발자가 되기위해선 꾸준한 기록이 필요하고 꾸준한 기록은 기록 자체를 더 단순하고 간결하게 만들어야 가능하다고 생각한다. 앞으로 이를 위해 계속해서 블로그 포스팅 방법을 수정 보완할 예정이다. 오늘 한 것 파이썬 딕셔너리를 능숙하게 사용하지 못하는 것 같아서 이를 보완하고자 문법을 정리하여 포스팅했다. 강의를 참고하여 js로 '숫자 맞추기 게임'을 만들어 배포하였다. 배포 링크 2022.03.04 - [Dev/Language] - Python 딕셔너리 추가, 삭제 메서드 정리 2022.03.04 - [Dev/Language] - Python 딕셔너리 가져오기 메서드 정리 성장한 점 파이썬 딕셔너리에 대해 몰랐던 메서드를..

Log/Today 2022.03.04

파이썬에서의 객체가 무엇인지 알게되었다.

오늘 한 것 객체지향의 사실과 오해 2장 읽고 블로그 포스팅 2022.02.10 - [Review series/객체지향의 사실과 오해] - 행동이 상태를 결정한다. 객체의 행동과 상태를 구현한 코드 작성 깃헙 링크 DRF 공식문서 1개 토픽 번역 및 포스팅 2022.02.10 - [Document translation/Django REST framework] - Class-based Views 성장한 점 객체의 특성, 그리고 파이썬에서의 객체가 무엇인지 알게되었다. (알고보니 파이썬은 모든 값이 객체였다...!) DRF를 익히기 위해 공식문서에 처음 번역해보았다. 노력할 점 객체를 이해하는데 오래걸려 다른 CS 공부가 더디게 진행되고 있다. 어느정도 이해했다면 다른 공부로 넘어가도 좋을 것 같다. DRF..

Log/Today 2022.02.11

Overloading 과 Overriding 을 Python코드로 구현

결론 'Overriding'은 상속받은 내용을 덮어쓰기 'Overloading'은 다양한 형태의 인수로 동일한 함수를 실행하기 쉽게 이해하기위해 범위를 좁혀 말하자면 위와 같다고 할 수 있다. (실제는 좀 더 넓은 개념으로 생각하면 좋을 것 같다.) Overriding 예제 코드 # 부모 클래스 class ParentMoney: def introduce(self, name): self.money = 1000 self.name = name self.word = "어때 부럽지?" return f"내 이름은 {self.name}, {self.money}원을 가지고 있지. {self.word}" # 자식 클래스 class ChildMoney(ParentMoney): def introduce(self, name)..

정수 제곱근 판별

문제 설명 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요. 제한 사항 n은 1이상, 50000000000000 이하인 양의 정수입니다. 입출력 예#1 121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다. 입출력 예#2 3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다 해결 방법 1. n의 제곱근을 구한다. 2. 제곱근이 정수로 나누어 떨어진다면 1을 더하고 제곱을 구한다. 3. 제곱근이 정수로 나누어 떨어지지 않으면 -1을 반환한다. def solution(n): a = n ** (1 / 2) ret..

if 사용하지 않고 제일 작은 수 제거하기

문제 설명 정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를 들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴하고, [10] 면 [-1]을 리턴합니다. 제한 조건 arr은 길이 1 이상인 배열입니다. 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다. 추가조건 >>> if는 사용하지 않습니다. 해결 방법 1. 리스트에서 최소 값을 구한다. 2. 구한 최소 값을 리스트에서 지운다. 3. 논리 연산자를 활용하여 최소 값을 지운 리스트를 반환한다. 4. 만약 리스트가 비어있다면 [-1]을 반환한다. * or은 첫 번째가 참이면 첫 번째 ..

짝수와 홀수 3가지 풀이법(if, dict, list) 그리고 bitwise

문제 설명 정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요. 제한 조건 num은 int 범위의 정수입니다. 0은 짝수입니다. 해결 방법 def solution(num): # 첫 번째 방법 : if-삼항연산자 return "Odd" if num % 2 == 1 else "Even" # 두 번째 방법 : dict-key return { 1 : 'Odd', 0 : 'Even'}[num % 2] # 세 번째 방법 : list-index return ["Even", "Odd"][num & 1] # or [num % 2] 이 문제는 보자마자 1분 만에 풀었다. (홀짝? 이건 너무 쉽잖아!) 처음 푼 방법은 if-삼항연산자였다. % 연산자를 이..

메모리에서 파일로 선입선출이 아닌 벌크 이동

목표 메모리에서 파일로 데이터 이동시 선입선출이 아닌 벌크로 이동시키기 문제 메모리에서 파일로 1개씩 선입선출로 이동하는 것은 좋지 않다는 피드백 받음. 생각해보니 메모리와 파일의 데이터를 모두 합쳐 반환하는 로직을 구현하였으므로 굳이 1개씩 보낼 이유가 없었음. 즉, 데이터를 한 번에 옮기는 것이 훨씬 효율적으로 보여 이를 수정하고자 함. 행동 기존에 선입선출을 위해 사용했던 pop() 매서드를 제거하고 대신 데이터 이동 후 clear() 매서드로 데이터를 지워주었다. def memory_data(arg): args.append(arg) if len(args) > 99: insert_file(args) args.clear() # 비워주지 않으면 중복 값이 계속 이동하므로! global memory_ar..

Log/Today 2022.01.19