19. 스페셜 메서드

2024. 9. 30. 22:53파이썬(python)

 

1. 스페셜 메서드
* 파이썬의 스페셜 메서드(또는 매직 메서드라고도 불림)는 더블 언더스코어(__)로 시작하고 끝나는 이름을 갖습니다. 이 메서드들은 구문이나 내장 함수를 사용할 때 파이썬 인터프리터에 의해 자동으로 호출됩니다.
예를 들어, 객체에 대해 + 연산자를 사용하면 해당 객체의 add 메서드가 호출됩니다. 또는 len()함수를 사용하면 len 메서드가 호출됩니다.


1-1.__repr__()
* 객체의 상태를 개발자가 쉽게 이해할 수 있도록 반환
* 재생성 할 수 있는 코드를 출력하도록 함
* 객체의 주요 정보를 담고 있어야함.


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

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

2)
Rucy = Dog('루시', 14)
print(repr(Rucy))
print(Rucy)
-->
Dog(name='루시', age=14)
Dog(name='루시', age=14)


#1-2.eval() :
#-파이썬 내장 함수로 문자열로 표현된 파이썬 코드를 실행하고 그 결과를 변환하는 기능

3)
x = 10
y = 3
result = x + y
print(result)
result = eval("x + y")
print(result)
-->
13
13


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

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

Rucy = Dog('루시', 14)

Rucy_repr = repr(Rucy)
new_Rucy = eval(Rucy_repr)
print(new_Rucy)

new_Rucy == Rucy   #False, 같은 값을 가진 다른 객체이다
-->
Dog(name='루시', age=14)
False


1-2.__str__
* 객체가 사람이 이해하기 쉽게 표현되도록 문자열로 변환하는 역할


* __repr__()와 __str__()의 차이
  \*\_\_repr\_\_(): 프로그래머에게 유용한 객체의 자세한 표현을 반환
  \*\_\_str\_\_() : 사람이 읽기 쉽게 표현한 객체의 비공식적인 문자열을 반환
\*print()는 항상 __str__를 우선 호출함, __str__()가 없을때 __repr__() 호출됨


1)
class Book:
  def __init__(self, title):
    self.title = title

book = Book('미친듯이 재밌는 파이썬')
print(book)
print(Book)
-->
<__main__.Book object at 0x780744cc4640>
<class '__main__.Book'>


2)
class Book:
  def __init__(self, title):
    self.title = title
  def __str__(self):
    return self.title  
book = Book('미친듯이 재밌는 파이썬')
print(book)
print(str(book))
-->
미친듯이 재밌는 파이썬
미친듯이 재밌는 파이썬


1-3. __add__()
* 연산자 오버로딩 메서드로 '+'연산이 정의되어 있음
* '+' 연산자를 사용했을 경우 그 동작을 커스터마이즈하기 위해 사용


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

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

kim = Student('김사과', 20)
lee = Student('이메론', 30)
print(kim + lee)
-->
50


1-4. __len__():
* 객체의 길이(또는 크기)를 반환하는 메서드로 len()함수가 호출될때 자동으로 실행됨


1)
class Queue:
  def __init__(self):
    self.items = [1,2,3,4,5]

  def __len__(self):        #중요 사항
    return len(self.items)

li = [1,2,3,4,5]
print(len(li))
print(li)

queue = Queue()
print(queue)
print(len(queue))
-->
5
[1, 2, 3, 4, 5]
<__main__.Queue object at 0x780744d75600>
5


2)
class Queue:
  def __init__(self):
    self.items = [1,2,3,4,5]

  def __len__(self):        #중요 사항
    return len(self.items)

li = [1,2,3,4,5]
print(len(li))
print(li)

queue = Queue()
print(queue)
print(len(queue))
-->
5
[1, 2, 3, 4, 5]
<__main__.Queue object at 0x780744d75600>
5


1-5. __getitem__()
* 객체를 리스트나 딕셔너리처럼 인덱싱 할 수 있도록 해주는 메서드
* __get__item()를 오버라이드하면,
사용자 정의 클래스의 인스턴스에서도 인덱스, 키, 슬라이싱등을 사용해 요소에 접근 할 수 있게됨


1)
class Point:
  def __init__(self, x, y):
    self.x = x
    self.y = y

  #중요 사항
  def __getitem__(self, index):  
    if index == 0:
      return self.x
    if index == 1:
      return self.y
    else:
      return -1

pt = Point(5, 3)
print(pt)
print(pt[0])
print(pt[1])
print(pt[-1])
-->
<__main__.Point object at 0x7807451c50f0>
5
3
-1


2)
class MyList:
  def __init__(self, data):
    self.data = data
  def __getitem__(self, index):
    return self.data[index]

ml = MyList([10,20,30,40])
print(ml[0])
print(ml[1])
print(ml[-1])
-->
10
20
40


1-6. __call__() :
* 클래스의 인스턴스를 함수처럼 호출 할 수 잇게 만들어주는 메서드


1)
class CallableObject:
  def __call__(self, *args, **kwargs):
    print(f'args: {args}, kwargs:{kwargs}')

callable_obj = CallableObject()
callable_obj(1, 2, 3, a = 'A', b= 'B')
-->
args: (1, 2, 3), kwargs:{'a': 'A', 'b': 'B'}


2)
class Dog:
  name = ''
  age = 0
  family = ''

  def eat(self):
    print('사료를 먹습니다.')

Rucy = Dog()
Rucy.eat()
-->
사료를 먹습니다.
728x90
LIST

'파이썬(python)' 카테고리의 다른 글

21. 파이썬 모듈  (0) 2024.10.02
20. 예외 처리  (1) 2024.09.30
18. 파이썬의 상속  (2) 2024.09.30
17. 클로저  (2) 2024.09.30
16. 객체지향과 클래스  (2) 2024.09.27