Python to AI

매직 메서드(Magic Methods), 클래스 메서드(Class Methods), 정적 메서드(Static Methods), 상속(Inheritance)

최 수빈 2024. 11. 12. 19:29

 

매직 메서드(Magic Methods)

 

특별한 역할을 수행하는 미리 정의된 메서드

__init__

 

처럼 두개의 underbar로 시작하고 끝남

 

클래스의 특정 동작을 제어, 변경할 수 있다.

-> 일반적으로 클래스 인스턴스의 기본 동작 수정, Python의 기본 동작을 재정의할 때 사용

 

#__init__
#객체가 생성될 때 호출되는 생성자 메서드, 객체의 초기화 담당

def __init__(self, name, age):
    self.name = name
    self.age = age
#__repr__
#객체의 '공식적인' 문자열 표현 반환 메서드, 주로 디버깅 위해 사용 (개발자용)

def __repr__(self):
    return f"Person('{self.name}',{self.age})"
#__add__
#객체 간의 덧셈 연산 정의 메서드, + 연산자 재정의 가능

def __add__(self, other):
    return self.age + other.age
    
a = 10
print(a.__add__(4))  # 14
#__eq__
#두 객체가 같은지 비교하는 메서드, == 연산자 재정의

def __eq__(self, other):
    return self.name == other.name and self.age == other.age
#__str__
#객체의 문자열 표현 반환 메서드, 주로 사용자에게 표시할 때 의미 있는 정보를 간결하게 제공
#사람이 읽기 쉽게! (사용자용)

def __str__(self):
    return f"{self.name}는 {slef.age}살 입니다."
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name}는 {self.age}살입니다."

    def __add__(self, other):
        return self.age + other.age

#객체 생성
person1 = Person("Alice",30)
person2 = Person("Bob", 25)

#__str__메서드 호출
print(person1)
print(person2)

#__add__메서드 호출
print(person1+person2)

 

클래스 메서드(Class Method)

 

클래스 자체를 인수로 받는 메서드

클래스 변수를 다루거나 클래스 자체에 대한 작업 수행할 때 사용

@classmethod 데코레이터 사용하여 정의

첫번째 매개변수로 cls를 받음

cls는 클래스 '자신'을 참조

 

class MyClass:
    class_variable = 0 #클래스를 대표하는 변수

    @classmethod
    def increment(cls): 
        cls.class_variable += 1

#클래스 메서드 호출
MyClass.increment()
print(MyClass.class_variable) #1

#increment 메서드는 클래스 변수 class_variable의 값을 증가 시킴(이 메서드는 객체가 아닌 클래스 자체에서 호출=> 매개변수)

MyClass.increment()
print(MyClass.class_variable) #1에서 값을 1증가시켜 2가 되고, 2 print

a = MyClass()
print(a.class_variable) #a라는 MyClass의 객체 생성, class_variable(변수) 공유함 따라서 2출력

MyClass.increment()
print(MyClass.class_variable) #3

b = MyClass()
print(b.class_variable) #3

=> 어떤 하나의 객체에서 값을 바꿔버리면 전체가 영향을 받음, 주의필요

print(a.class_variable) #4
a.increment() #4

b.increment() #5
print(b.class_variable) #5

 

정적 메서드(Static Methods)

 

클래스나 객체와는 관련이 없지만 클래스의 맥락에서 의미가 있는 메서드

 

@staticmethod 데코레이터 사용하여 정의

첫번째 매개변수로 self나 cls를 받지 않음

 

클래스의 일부로 포함되어야 하는, 그러나 객체의 상태나 클래스의 상태와 무관한 기능을 수행할 때 유용

 

class MathUtils:
    @staticmethod
    def add(x, y):  # x와 y는 클래스나 인스턴스의 속성이 아님
        return x + y

 

 

  • 정적 메서드 (@staticmethod): 클래스와 인스턴스 상태에 접근하지 않는 독립적인 함수.
  • 클래스 메서드 (@classmethod): cls를 매개변수로 받아 클래스를 참조하고, 클래스 변수를 다루는 메서드.
  • 인스턴스 메서드: self를 매개변수로 받아 객체 인스턴스를 참조하고, 인스턴스 변수를 다루는 일반 메서드.
class Dog:
    def __init__(self, name):
        self.name = name  # 인스턴스 속성

    def bark(self):  # 인스턴스 메서드
        return f"{self.name} says woof!"

# 인스턴스 생성 및 메서드 호출
dog = Dog("Buddy")
print(dog.bark())  # 출력: Buddy says woof!

 

 

상속(Inheritance), 기본구조

 

기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받아 사용하는 개념
상속을 통해 재사용성 높이고, 기존 기능을 확장하거나 수정가능

=> 코드 재사용, 유지보수성, 확장성

 

class ParentClass:
    #부모 클래스의 내용
class ChildCalss(ParentClass):
    #자식 클래스의 내용(부모 클래스의 속성과 메서드를 상속받음)
class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        return "소리를 냅니다."
class Dog(Animal): #Animal 클래스를 상속받아 Dog 클래스 정의
    def speak(self): #부모 클래스의 메서드를 재정의(오버라이딩)
        return f"{self.name}가 멍멍 짖습니다."
#객체 생성
dog = Dog("Buddy")
print(dog.speak())

#Dog클래스는 Animal클래스를 상속받아서 name속성, speak메서드 물려받음
#Dog클래스는 speak메서드를 오버라이딩(재정의)하여 고유한 동작을 정의

 

 

응용코드

 

class human:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f"human('{self.name}',{self.age})"

    def __add__(self,other):
        print(self.name + other.name)
        print(self.age + otehr.age)


    def __eq__(self, other):
        if self.name == other.name:
            print("동일 이름입니다.")
        else:
            print("다른 이름입니다.")

    def __str__(self):
        return f"{self.name}은 {self.age}살입니다."

class Animal:
    def __init__(self, name):
        self.name = name
        print("부모의 생성자입니다.")

    def speak(self):
        return "소리를 냅니다."

    def test(self):
        return "동물이네요."


class Dog(Animal): #Animal클래스를 상속받아 Dog클래스 정의
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age
    def speak(self): #부모 클래스의 메서드 재정의(오버라이딩)
        return f"{self.name}가 멍멍 짖습니다."


dog = Dog("Buddy", 31)

print(dog.speak())

 

# abc모듈사용, 추상 클래스 & 추상 메서드

from abc import ABC, abstractmethod

class Animal(ABC): #ABC를 상속받아 추상 클래스 정의
    @abstractmethod #무조건 자식 클래스에서 아래 정의한 기능 구현해줘야함
    def sound(self): #추상 메서드로 선언
        pass

class Dog(Animal):
    def __init__(self,name):
        self.name = name

    def sound(self): #추상 메서드 구현
        print("멍멍이는 멍멍")

dog_bob.sound() #출력 : 멍멍이는 멍멍