PY_class | Operator Overloading, 연산자 오버로딩 / 스페셜 메소드

Stellar·2023년 11월 2일
0

Python

목록 보기
30/36

Operator Overloading, 연산자 오버로딩 / 스페셜 메소드

클래스끼리 또는 클래스에 연산을 사용하고 싶은데 클래스는 애초에 요소가 아니니 불가능하다.
아래 코드와 같이 변수에 클래스를 정의 후 더하기를 하니 타입에러가 발생 함.

class Point :
    def __init__(self, x=0, y=0) :
        self.x = x
        self.y = y
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)
=============================== RESTART: C:\Users\GIEC\Desktop\기초문법\1102\test.py ==============================
Traceback (most recent call last):
  File "C:\Users\GIEC\Desktop\기초문법\1102\test.py", line 9, in <module>
    print(p1 + p2)
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'

따라서 연산자를 클래스 내 메소드로 정의하는 것을 연산자 오버로딩이라 함.
이름을 직접 명시하여 호출하지 않더라도 상황에 따라 자동으로 호출되는 메소드이며 name 과 같은 형태.
파이썬은 overlode 를 지원하지 않기 때문에 두개의 add()를 선언해도 하나만 유효
참고

✔️ 오버로딩 예제. class equal option

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

#equal 함수 생성 후 기호로 사용.
    def __eq__(self, other) :
        return self.age == other.age and self.name == other.name

kim = Human(29, '이유리')
lee = Human(29, '이유리')
moon = Human(50, '이지민')
print(kim == lee)
print(kim == moon)

✔️ 오버로딩 예제2. class add

class Point :
    def __init__(self, x=0, y=0) :
        self.x = x
        self.y = y
    def __add__(self, other) :
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)
    def __str__(self) :
        return 'Point(' + str(self.x) + ',' + str(self.y) + ')'
        

p1 = Point(1, 2) #변수에 정의한 클래스에 값을 담아준다.
p2 = Point(3, 4)
print(p1 + p2) #각 변수에 정의한 클래스를 더한다. 이때 +를 add로 인식하고 __add__에 담긴 코드를 실행한다.

✔️ 오버로딩 예제3. class add

class Book :
    title = ' '
    pages = 0
    
    def __init__(self, title=' ', pages=0) :
        self.title = title
        self.pages = pages

    def __str__(self) :
        return self.title

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

book1 = Book('자료구조', 600)
book2 = Book('C언어', 700)
print(book1 + book2)
print(book1) #__str__ 자동 실행하므로 타이틀을 반환 함.

✔️ 오버로딩 예제4. class str

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

    def __str__(self) :
        return '이름 %s, 나이 %d' % (self.name, self.age)

kim = Human(29, '신승희')
print(kim)

✔️ 오버로딩 예제5. class length

length를 썼는데 왜 길이가 아닌 나이만 리턴하는거지??

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

    def __len__(self) :
        return self.age

kim = Human(29, '신유리')
print(len(kim))

0개의 댓글