name mangling

Name Mangling 파이썬에서 “name mangling"은 클래스 내부의 속성이나 메서드의 이름을 변경하는 기능이다. 이 기능은 주로 정보 은닉과 캡슐화를 위해 사용된다. 네임 맹글링의 작동 방식 더블 언더스코어 사용: 클래스 내에서 속성이나 메서드 이름 앞에 두 개의 언더스코어(__)를 붙이면 자동으로 네임 맹글링이 적용된다. 1 2 3 4 5 6 7 8 9 10 11 class Person: def __init__(self): self.__name = "김철수" # 실제로는 '_Person__name'으로 변환됨 def __private_method(self): # 실제로는 '_Person__private_method'로 변환됨 return "비공개 메서드" person = Person() print(dir(person)) # 실제 변환된 이름을 확인할 수 있음 print(person.__name) # AttributeError 발생 print(person._Person__name) # 김철수 출력 이름 변환 규칙: ...

November 25, 2024 · 2 min · Me

Python Super

Python Super super()는 상속 관계에서 부모 클래스의 메서드를 호출하는 데 사용되는 중요한 도구. 부모 클래스(슈퍼클래스)의 메서드를 호출할 때 사용된다. 주로 자식 클래스에서 부모 클래스의 메서드를 확장하거나 재정의할 때 활용된다. 사용 예제: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Animal: def __init__(self, name): self.name = name def speak(self): return f"{self.name} makes a sound" class Dog(Animal): def __init__(self, name, breed): # 부모 클래스의 __init__ 메서드 호출 super().__init__(name) self.breed = breed def speak(self): # 부모 클래스의 speak 메서드를 확장 base_sound = super().speak() return f"{base_sound} - specifically, a woof!" # 사용 예시 my_dog = Dog("Rex", "Golden Retriever") print(my_dog.speak()) # 출력: "Rex makes a sound - specifically, a woof!" 특징 부모 클래스 참조: super()는 현재 클래스의 부모 클래스를 참조한다. 메서드 연결: 부모 클래스의 메서드에 접근하여 호출할 수 있게 한다. 동적 결정: 런타임에 메서드 호출을 결정한다. MRO(Method Resolution Order) 활용: 다중 상속 시 메서드 해석 순서를 따른다. 장점 코드 재사용: 부모 클래스의 코드를 재사용하여 중복을 줄인다. 유연성: 부모 클래스의 구현을 변경해도 자식 클래스에서 수정할 필요가 없다. 다중 상속 지원: 복잡한 상속 구조에서도 적절한 부모 메서드를 호출할 수 있다. 단점 복잡성: 다중 상속 시 상속 구조가 복잡해질 수 있다. 예상치 못한 동작: 상속 계층에 따라 의도하지 않은 메서드가 호출될 수 있다. 주요 사용 방법 super().init(): 부모 클래스의 생성자를 호출한다. super().method_name(): 부모 클래스의 특정 메서드를 호출한다. super()의 고급 기능과 특징 다중 상속에서의 활용 super()는 다중 상속 상황에서 메서드 해결 순서(MRO)를 따라 적절한 메서드를 찾아준다: ...

November 25, 2024 · 4 min · Me

Method Resolution Order (MRO)

Method Resolution Order (MRO) 파이썬에서 클래스의 상속 관계에서 메서드를 찾는 순서를 정의하는 규칙으로 자식과 부모 클래스를 모두 포함하여 메서드의 실행 순서를 정한다. 이는 특히 다중 상속이 있을 때 매우 중요하다. 파이썬은 C3 선형화 알고리즘을 사용하여 이 순서를 결정한다. MRO와 관련된 문제가 발생하면 __mro__ 속성을 통해 메서드 해결 순서를 확인하고, 필요한 경우 클래스 계층 구조를 재설계하거나 명시적인 메서드 호출을 사용하여 문제를 해결할 수 있다. 동작 방식 호출된 자식 클래스를 먼저 확인한다. 그 다음 상속된 클래스들을 나열한 순서대로 확인한다. 우선순위 자식 클래스 부모 클래스 (먼저 상속받을수록 우선순위가 높음) 부모 클래스의 부모 클래스 (존재하는 경우) object 클래스 (최상위) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class A: def method(self): print("A's method") class B(A): def method(self): print("B's method") class C(A): def method(self): print("C's method") class D(B, C): pass # MRO 확인 print(D.__mro__) # 출력: (<class '__main__.D'>, <class '__main__.B'>, # <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) d = D() d.method() # B's method가 출력됨 다이아몬드 문제와 MRO 다이아몬드 문제는 다중 상속에서 발생할 수 있는 고전적인 문제. 파이썬의 MRO는 이 문제를 해결하는 방법을 제공한다. ...

November 25, 2024 · 3 min · Me

classmethod and staticmethod

Classmethod and Staticmethod Python의 클래스에서 사용되는 두 가지 다른 종류의 메서드 데코레이터 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class MyClass: class_var = 0 # 클래스 변수 def __init__(self): self.instance_var = 0 # 인스턴스 변수 # 일반 인스턴스 메서드 def instance_method(self): return f"instance method: {self.instance_var}" # 클래스 메서드 @classmethod def class_method(cls): return f"class method: {cls.class_var}" # 정적 메서드 @staticmethod def static_method(): return "static method" Classmethod 특징 @classmethod 데코레이터 사용 첫 번째 매개변수로 클래스 자신(cls)을 자동으로 받음 클래스 변수에 접근 가능 상속 시 cls는 현재 클래스를 참조 주요 사용 사례 대체 생성자(Alternative Constructor) 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def from_string(cls, date_string): year, month, day = map(int, date_string.split('-')) return cls(year, month, day) @classmethod def from_timestamp(cls, timestamp): import datetime date = datetime.datetime.fromtimestamp(timestamp) return cls(date.year, date.month, date.day) # 사용 예시 date1 = Date.from_string('2024-03-20') date2 = Date.from_timestamp(1710915600) # 2024-03-20의 타임스탬프 클래스 상태 관리 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Student: total_students = 0 # 클래스 변수 def __init__(self, name): self.name = name Student.total_students += 1 @classmethod def get_total_students(cls): return cls.total_students @classmethod def reset_total_students(cls): cls.total_students = 0 # 사용 예시 student1 = Student("John") student2 = Student("Jane") print(Student.get_total_students()) # 출력: 2 Student.reset_total_students() print(Student.get_total_students()) # 출력: 0 Staticmethod 특징 @staticmethod 데코레이터 사용 첫 번째 매개변수로 아무것도 자동으로 받지 않음 클래스/인스턴스 변수에 직접 접근 불가 유틸리티 함수처럼 독립적으로 동작 주요 사용 사례 유틸리티 함수 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class MathOperations: @staticmethod def is_even(number): return number % 2 == 0 @staticmethod def is_prime(number): if number < 2: return False for i in range(2, int(number ** 0.5) + 1): if number % i == 0: return False return True @staticmethod def get_factors(number): return [i for i in range(1, number + 1) if number % i == 0] # 사용 예시 print(MathOperations.is_even(4)) # 출력: True print(MathOperations.is_prime(7)) # 출력: True print(MathOperations.get_factors(12)) # 출력: [1, 2, 3, 4, 6, 12] 헬퍼 메서드 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class FileProcessor: def __init__(self, filename): self.filename = filename @staticmethod def is_valid_file_format(filename): return filename.endswith(('.txt', '.csv', '.json')) @staticmethod def get_file_extension(filename): return filename.split('.')[-1] if '.' in filename else '' def process_file(self): if not self.is_valid_file_format(self.filename): raise ValueError("Invalid file format") # 파일 처리 로직… # 사용 예시 print(FileProcessor.is_valid_file_format('data.txt')) # 출력: True print(FileProcessor.get_file_extension('data.csv')) # 출력: csv Classmethod와 Staticmethod 비교 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Example: class_var = 10 def __init__(self): self.instance_var = 5 # 인스턴스 메서드 def instance_method(self): return self.instance_var, self.class_var # 클래스 메서드 @classmethod def class_method(cls): return cls.class_var # 클래스 변수 접근 가능 # return self.instance_var # 인스턴스 변수 접근 불가 # 정적 메서드 @staticmethod def static_method(): # 클래스/인스턴스 변수 직접 접근 불가 return "I am static" 사용 시 고려사항 Classmethod 사용 시기 클래스 상태를 수정하거나 접근해야 할 때 대체 생성자가 필요할 때 상속 시 다형성이 필요할 때 Staticmethod 사용 시기 클래스/인스턴스 상태와 무관한 유틸리티 함수가 필요할 때 네임스페이스 조직화가 필요할 때 순수 함수가 필요할 때 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class DataProcessor: data_format = 'json' # 클래스 변수 def __init__(self, data): self.data = data # classmethod 사용이 적절한 경우 @classmethod def change_data_format(cls, new_format): if cls.is_valid_format(new_format): # staticmethod 호출 cls.data_format = new_format return True return False # staticmethod 사용이 적절한 경우 @staticmethod def is_valid_format(format_str): return format_str.lower() in ['json', 'xml', 'yaml'] # 일반 인스턴스 메서드 def process(self): if not self.is_valid_format(self.data_format): raise ValueError("Invalid format") # 데이터 처리 로직… # 사용 예시 print(DataProcessor.is_valid_format('json')) # 출력: True DataProcessor.change_data_format('xml') # 데이터 형식 변경 Self와 Cls 기본 개념 self: 인스턴스 메서드에서 인스턴스 자신을 참조 cls: 클래스 메서드에서 클래스 자신을 참조 ...

November 24, 2024 · 6 min · Me

Generator and Iterator

Generator and Iterator 이터레이터는 값을 차례대로 반환하는 객체로, __iter__()와 __next__() 메서드를 구현한다. 제너레이터는 yield 키워드를 사용하여 값을 하나씩 반환하는 함수로, 이터레이터를 생성한다. 제너레이터와 이터레이터의 주요 차이점 비교 항목 이터레이터 제너레이터 정의 방식 __iter__와 __next__ 메서드를 구현하는 클래스 yield 키워드를 사용하는 함수 상태 저장 인스턴스 변수를 통해 명시적으로 상태 저장 함수의 실행 상태가 자동으로 저장 메모리 사용 모든 상태를 명시적으로 저장해야 함 필요한 값만 생성하여 메모리 효율적 구현 복잡도 상대적으로 복잡함 (여러 메서드 구현 필요) 매우 단순함 (일반 함수처럼 작성) 용도 복잡한 이터레이션 로직이 필요한 경우 간단한 순차적 데이터 생성 재사용성 클래스로 구현되어 재사용 용이 한 번 순회하면 소진됨 기능 확장성 클래스이므로 추가 메서드와 속성 정의 가능 함수 범위로 제한됨 성능 상태 관리를 위한 추가 오버헤드 존재 매우 가벼움 코드 가독성 구조화된 형태로 명확하나 장황할 수 있음 간결하고 직관적 양방향 통신 메서드를 통해 구현 가능 send() 메서드로 기본 제공 이러한 차이점들은 실제 사용에서 다음과 같은 의미를 가진다. ...

November 24, 2024 · 5 min · Me

Python - Generators

Generators 파이썬의 제너레이터(Generator)는 반복 가능한 객체를 생성하는 강력한 도구 제너레이터의 기능과 역할 메모리 효율성: 필요한 값만 생성하여 메모리를 절약합니다. 지연 평가: 필요할 때만 값을 생성하여 불필요한 연산을 피합니다. 무한 시퀀스 생성: 끝없는 데이터 스트림을 모델링할 수 있습니다. 복잡한 로직 간소화: 복잡한 반복 로직을 간단하게 표현할 수 있습니다. 제너레이터의 특징 yield 키워드 사용: 함수 내에서 yield를 사용하여 값을 반환합니다. 상태 유지: 함수의 로컬 변수를 통해 내부 상태를 유지합니다. 이터레이터 프로토콜 준수: next() 함수를 통해 값을 하나씩 가져올 수 있습니다. StopIteration 예외: 모든 값을 생성한 후 StopIteration 예외를 발생시킵니다. 제너레이터의 주요 장점 메모리 효율성: ...

November 24, 2024 · 3 min · Me

내장 데코레이터 (Built-in Decorator)

내장 데코레이터 (Built-in Decorators) 파이썬에는 다양한 내장 데코레이터가 있으며, 이들은 코드를 최적화하고 기능을 확장하는 데 중요한 역할을 한다. @property @property는 메서드를 속성처럼 사용할 수 있게 해주는 데코레이터. getter, setter, deleter 기능을 제공하여 데이터의 캡슐화와 접근 제어를 가능하게 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Person: def __init__(self): self._age = 0 @property def age(self): """getter 메서드""" return self._age @age.setter def age(self, value): """setter 메서드""" if value < 0: raise ValueError("나이는 음수일 수 없습니다") self._age = value @age.deleter def age(self): """deleter 메서드""" print("나이 정보가 삭제되었습니다") del self._age # 사용 예시 person = Person() person.age = 25 # setter 호출 print(person.age) # getter 호출 del person.age # deleter 호출 @abstractmethod 추상 메서드를 정의하는 데코레이터. abc(Abstract Base Classes) 모듈과 함께 사용되며, 하위 클래스에서 반드시 구현해야 하는 메서드를 지정할 때 사용. ...

November 24, 2024 · 2 min · Me

Docstring

Docstring python에서 함수, 클래스, 모듈에 대한 문서화를 위해 사용되는 문자열. 이는 코드의 가독성을 높이고 다른 개발자들이 코드를 이해하는 데 도움을 준다. 주요 특징 큰따옴표 세 개(""") 또는 작은따옴표 세 개(’’’)로 둘러싸인 문자열이다. 함수, 클래스, 모듈의 첫 번째 문장으로 위치한다. __doc__ 속성을 통해 프로그램 실행 중에 접근할 수 있다. 내장 함수 help()를 통해 문서를 볼 수 있다. 기능 코드의 목적과 동작을 설명한다. 함수의 매개변수, 반환값, 예외 등을 문서화한다. 모듈이나 클래스의 전반적인 기능을 설명한다. 자동 문서 생성 도구(예: Sphinx)를 통해 API 문서를 생성할 수 있다. 고려해야 할 중요한 점들 일관성: 프로젝트 전체에서 동일한 스타일을 사용해야 한다. 명확성: 설명은 간단하고 명확해야 하며, 예시가 있으면 더 좋다. 완전성: 모든 매개변수, 반환값, 예외 상황을 문서화해야 한다. 최신성: 코드가 변경될 때 Docstring도 함께 업데이트해야 한다. 활용 방법 1 2 3 4 5 6 # Docstring 확인하기 help(google_style) # help() 함수 사용 print(google_style.__doc__) # __doc__ 속성 직접 접근 # 대화형 셸에서 사용 >>> google_style? # IPython/Jupyter에서 자동 문서 생성을 위한 도구들 Sphinx: Python 프로젝트의 표준 문서화 도구. pdoc: 간단한 API 문서를 자동으로 생성한다. MkDocs: Markdown 기반의 문서 생성 도구이다. 각 스타일은 프로젝트의 성격이나 팀의 선호도에 따라 선택할 수 있다. 중요한 것은 프로젝트 내에서 일관성 있게 사용하는 것. 또한, IDE나 문서 생성 도구와의 호환성을 고려하여 선택하는 것이 좋다. ...

November 24, 2024 · 4 min · Me

연산자(Operators)

연산자(Operators) 연산자는 프로그래밍의 기본적인 구성 요소로, 데이터를 조작하고 계산하는 데 사용된다. 산술 연산자 산술 연산자는 수학적 계산을 수행한다. 연산자 의미 예시 결과 + 덧셈 5 + 3 8 - 뺄셈 5 - 3 2 * 곱셈 5 * 3 15 / 나눗셈 5 / 3 1.6666… // 몫 5 // 3 1 % 나머지 5 % 3 2 ** 거듭제곱 5 ** 3 125 비교 연산자 비교 연산자는 값을 비교하고 불리언 결과를 반환한다. ...

November 24, 2024 · 6 min · Me