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 |