본문 바로가기

BASIC47

추상 클래스 추상 클래스 파이썬은 추상 클래스(abstract class)라는 기능을 제공합니다. 추상 클래스는 메서드의 목록만 가진 클래스이며 상속받는 클래스에서 메서드 구현을 강제하기 위해 사용합니다. 먼저 추상 클래스를 만들려면 import로 abc 모듈을 가져와야 합니다( abc는 abstract base class의 약자입니다). 그리고 클래스의 ( )(괄호) 안에 metaclass=ABCMeta를 지정하고, 메서드를 만들 때 위에 @abstractmethod를 붙여서 추상 메서드로 지정합니다. from abc import * class 추상클래스이름(metaclass=ABCMeta): @abstractmethod def 메서드이름(self): 코드 여기서는 from abc import *로 abc 모듈의 .. 2023. 11. 17.
메서드 탐색 순서 메서드 탐색 순서 확인하기 많은 프로그래밍 언어들이 다이아몬드 상속에 대한 해결책을 제시하고 있는데 파이썬에서는 메서드 탐색 순서(Method Resolution Order, MRO)를 따릅니다. 클래스.mro() 클래스.__mro__ >>> D.mro() [, , , , ] object 클래스 파이썬에서 object는 모든 클래스의 조상입니다. 그래서 int의 MRO를 출력해보면 int 자기 자신과 object가 출력됩니다. >>> int.mro() [, ] class X: pass 괄호 안에 object를 넣은 것과 같습니다. class X(object): pass 파이썬 3에서는 괄호 안에 object를 넣어도 되고 넣지 않아도 됩니다. 2023. 11. 17.
메서드 오버라이딩 메서드 오버라이딩 class Person: def greeting(self): print('안녕하세요.') class Student(Person): def greeting(self): super().greeting() # 기반 클래스의 메서드 호출하여 중복을 줄임 print('저는 파이썬 코딩 도장 학생입니다.') james = Student() james.greeting() 안녕하세요. 저는 파이썬 코딩 도장 학생입니다. Student의 greeting에서 super().greeting()으로 Person의 greeting을 호출했습니다. 즉, 중복되는 기능은 파생 클래스에서 다시 만들지 않고, 기반 클래스의 기능을 사용하면 됩니다. 이처럼 메서드 오버라이딩은 원래 기능을 유지하면서 새로운 기능을 덧붙.. 2023. 11. 17.
super() 1. super()로 기반 클래스 초기화하기 이때는 super()를 사용해서 기반 클래스의 __init__ 메서드를 호출해줍니다. 다음과 같이 super() 뒤에 .(점)을 붙여서 메서드를 호출하는 방식입니다. super().메서드() class Person: def __init__(self): print('Person __init__') self.hello = '안녕하세요.' class Student(Person): def __init__(self): print('Student __init__') super().__init__() # super()로 기반 클래스의 __init__ 메서드 호출 self.school = '파이썬 코딩 도장' james = Student() print(james.school.. 2023. 11. 17.
정적 메서드 / 클래스 메서드 정적 메서드 와 클래스 메서드 사용하기 지금까지 클래스의 메서드를 사용할 때 인스턴스를 통해서 호출했습니다. 이번에는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메서드와 클래스 메서드에 대해 알아보겠습니다. 1. 정적 메서드 class 클래스이름: @staticmethod def 메서드(매개변수1, 매개변수2): 코드 class Calc: @staticmethod def add(a, b): print(a + b) @staticmethod def mul(a, b): print(a * b) Calc.add(10, 20) # 클래스에서 바로 메서드 호출 Calc.mul(10, 20) # 클래스에서 바로 메서드 호출 30 200 정적 메서드는 self를 받지 않으므로 인스턴스 속성에는 접근할 .. 2023. 11. 17.
특수 메서드 1. __slots__ : 특정 인스턴스 속성 제한 두기 인스턴스는 자유롭게 속성을 추가할 수 있지만 특정 속성만 허용하고 다른 속성은 제한하고 싶을 수도 있습니다. 이때는 클래스에서 __slots__에 허용할 속성 이름을 리스트로 넣어주면 됩니다. 특히 속성 이름은 반드시 문자열로 지정해줍니다. __slots__ = ['속성이름1, '속성이름2'] >>> class Person: ... __slots__ = ['name', 'age'] # name, age만 허용(다른 속성은 생성 제한) ... >>> maria = Person() >>> maria.name = '마리아' # 허용된 속성 >>> maria.age = 20 # 허용된 속성 >>> maria.address = '서울시 서초구 반포동' # .. 2023. 11. 17.
비공개 속성, 메서드 사용하기 비공개 속성, 메서드 사용하기 클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할 수 있는 비공개 속성(private attribute)을 사용해보겠습니다. 비공개 속성은 클래스 안의 메서드에서만 접근할 수 있습니다. 비공개 속성은 __속성과 같이 이름이 __(밑줄 두 개)로 시작해야 합니다. 단, __속성__처럼 밑줄 두 개가 양 옆에 왔을 때는 비공개 속성이 아니므로 주의해야 합니다. class 클래스이름: def __init__(self, 매개변수) self.__속성 = 값 class Person: def __init__(self, name, age, address, wallet): self.name = name self.age = age self.address = address self.__.. 2023. 11. 17.
위치 인수, 키워드 인수 참고 | 클래스의 위치 인수, 키워드 인수 클래스로 인스턴스를 만들 때 위치 인수와 키워드 인수를 사용할 수 있습니다. 규칙은 함수와 같습니다. 위치 인수와 리스트 언패킹을 사용하려면 다음과 같이 *args를 사용하면 됩니다. 이때 매개변수에서 값을 가져오려면 args[0]처럼 사용해야 합니다. class Person: def __init__(self, *args): self.name = args[0] self.age = args[1] self.address = args[2] maria = Person(*['마리아', 20, '서울시 서초구 반포동']) 키워드 인수와 딕셔너리 언패킹을 사용하려면 다음과 같이 **kwargs를 사용하면 됩니다. 이때 매개변수에서 값을 가져오려면 kwargs['name']처.. 2023. 11. 17.
튜플 응용하기 메서드 설명 index(값) 리스트에서 특정 값의 인덱스를 구함 count(값) 리스트에서 특정 값의 개수를 구함 튜플 응용하기 이번에는 튜플의 메서드와 다양한 사용 방법을 알아보겠습니다. 튜플은 리스트와는 달리 내용을 변경할 수 없습니다(불변, immutable). 따라서 내용을 변경하는 append 같은 메서드는 사용할 수 없고, 요소의 정보를 구하는 메서드만 사용할 수 있습니다. 튜플에서 특정 값의 인덱스 구하기 index(값)은 튜플에서 특정 값의 인덱스를 구합니다. 이때 같은 값이 여러 개일 경우 처음 찾은 인덱스를 구합니다(가장 작은 인덱스). 다음은 53이 세 번째에 있으므로 인덱스 2가 나옵니다. >>> a = (38, 21, 53, 62, 19, 53) >>> a.index(53) 2 특.. 2023. 10. 9.