1. 매직메서드의 정의
매직 메서드는 파이썬에서 특별한 기능을 제공하는 메서드입니다. 다른 메서드와 달리 **더블 언더스코어(__)**로 시작하고 끝나며, 클래스 내부적으로 구현되어 있습니다.
예제)
n = 10
print(type(n)) #출력:<class 'int'> -> n은 변수이지만, 클래스 int형이란 뜻 따라서 매직메서드를 호출 가능
print(dir(n))
# 출력:
# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewa
# rgs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd
# __', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__r
# xor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_b
print(n.__doc__) # 클래스 int에 대한 설명
#출력:
# int([x]) -> integer
# int(x, base=10) -> integer
#
# Convert a number or string to an integer, or return 0 if no arguments
# are given. If x is a number, return x.__int__(). For floating point
# numbers, this truncates towards zero.
#
# If x is not a number or if base is given, then x must be a string,
# bytes, or bytearray instance representing an integer literal in the
# given base. The literal can be preceded by '+' or '-' and be surrounded
# by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.
# Base 0 means to interpret the base from the string as an integer literal.
# >>> int('0b100', base=0)
# 4
print(n.__add__(100), n+100) # 출력:110 110
print(n.__bool__(),bool(n)) #출력: True True
print(n.__mul__(100),n*100) # 출력: 1000 1000
print(n.__pow__(2), n**2) # 출력: 100 100
2. __init__ 메서드
파이썬에서 __init__ 메서드는 클래스를 정의할 때 초기화 작업을 수행하는 특별한 메서드입니다. __init__은 "이니셜라이제이션"을 의미하며, 클래스의 객체가 생성될 때 자동으로 호출되는 메서드입니다.
__init__ 메서드를 사용하면 객체가 생성될 때 초기화 작업을 수행하여 해당 클래스의 속성을 설정할 수 있습니다. 이를 통해 객체가 생성될 때 필요한 초기 상태를 설정하거나 다른 초기화 작업을 수행할 수 있습니다.
__init__ 메서드는 다음과 같은 형식으로 정의합니다
class 클래스명:
def __init__(self, 인자1, 인자2, ...):
# 초기화 작업을 수행하는 코드
self.속성1 = 인자1
self.속성2 = 인자2
# ...
__init__ 메서드의 첫 번째 인자로 self를 사용하는데, 이는 해당 메서드가 호출되는 객체 자신을 나타냅니다. 이를 통해 self를 사용하여 객체의 속성을 설정하거나 호출할 수 있습니다.
예를 들어, 다음과 같이 __init__ 메서드를 사용하여 클래스의 초기 상태를 설정할 수 있습니다
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# Person 클래스의 객체 생성
person1 = Person("철수", 30)
person2 = Person("영희", 25)
print(person1.name, person1.age) # 출력: 철수 30
print(person2.name, person2.age) # 출력: 영희 25
위의 예시에서 Person 클래스의 __init__ 메서드는 이름(name)과 나이(age)라는 인자를 받아서 객체의 속성으로 설정하고 있습니다. 객체를 생성할 때 Person("철수", 30)와 같이 인자를 전달하여 초기 상태를 설정할 수 있습니다.
__init__ 메서드를 사용하면 클래스의 객체를 생성하고 초기화하는 작업을 간편하게 처리할 수 있으며, 클래스의 속성을 쉽게 설정할 수 있습니다.
3. __str__ 메서드 와 __repr__ 메서드
파이썬에서 __str__ 메서드는 사용자에게 유용한 정보를 주기 위해 사용합니다.
반면에 __repr__ 메서드는 개발자가 디버깅과 개발을 하는데 주로 사용합니다.
따라서 표시되는 내용을 이에 맞게 구현합니다.
둘 중 하나의 메서드가 있을 때 print 를 사용하면 자동으로 __str__메서드 또는 __repr__ 메서드의 내용을 출력합니다. 만약에 두개의 메서드가 모두 있다면 __str__ 메서드를 우선합니다.
두개의 메서드가 모두 없다면 객체의 래핑된 값을 출력합니다.
예제1) 클래스에 메서드가 있을 떄
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}는 {self.age}살이다."
def __repr__(self):
return f"Person(name: {self.name}, age: {self.age})"
p = Person("mike",30)
print(p.__str__()) #출력:mike는 30살이다.
print(p.__repr__()) #출력:Person(name: mike, age: 30)
예제2) 클래스에 메서드가 없을 때
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("mike",30)
print(p.__str__()) #출력:<__main__.Person object at 0x000001A8F1BAAFD0>
print(p.__repr__()) #출력:<__main__.Person object at 0x000001A8F1BAAFD0>
4. __dict__ 메서드
__dict__ 메서드는 객체의 내용을 key와 value로 보기 위해 사용합니다.
클래스에 메서드를 구현해 놓지 않아도 바로 사용 가능합니다.
예제)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("mike",30)
print(p.__dict__) # 출력: {'name': 'mike', 'age': 30}
5. 연산 메서드
class Fruit:
def __init__(self,name, price):
self._name = name
self._price = price
def __str__(self):
return f"과일 이름은 {self._name}, 과일 가격은 {self._price}입니다."
def __add__(self, other): # 더하는 메서드
print("__add__ 메서드 호출")
return self._price + other._price
def __sub__(self, other): # 빼는 메서드
print("__sub__ 메서드 호출")
return self._price - other._price
def __le__(self, other): # 대소비교 메서드 '='을 포함해야 한다.
print("__le__ 메서드 호출")
if self._price <= other._price:
return True
else:
return False
def __ge__(self, other): # 대소비교 메서드 '='을 포함해야 한다.
print("__ge__ 메서드 호출")
if self._price >= other._price:
return True
else:
return False
f1 = Fruit('apple',8000)
f2 = Fruit('orange',5000)
print(f1) #출력: 과일 이름은 apple, 과일 가격은 8000입니다.
print(f2) #출력: 과일 이름은 orange, 과일 가격은 5000입니다.
print(f1+f2)
# 출력:
# __add__ 메서드 호출
# 13000
print(f1 - f2)
#출력:
# __sub__ 메서드 호출
# 3000
print(f1>=f2)
# 출력:
# __ge__ 메서드 호출
# True
print(f1<=f2)
#출력:
# __le__ 메서드 호출
# False
6. 좌표 연산 메서드
class Vector:
def __init__(self,*args):
'''
create vector, example : v = Vector(5,10)
'''
if len(args) ==0:
self._x, self._y = 0,0
else:
self._x,self._y = args
def __repr__(self):
'''
:return vector information
'''
return 'Vector(%r,%r)' % (self._x,self._y)
def __add__(self, other):
return Vector(self._x+other._x, self._y+other._y)
def __mul__(self, other):
return Vector(self._x * other, self._y*other)
def __bool__(self):
'''
if 0,0 return false else return true
'''
return bool(max(self._x,self._y))
v1 = Vector(5,7)
v2 = Vector(25,30)
v3 = Vector()
# 매직메서드 출력
print(Vector.__init__.__doc__) #출력: create vector, example : v = Vector(5,10)
print(Vector.__repr__.__doc__) #출력: :return vector information
print(Vector.__bool__.__doc__) #출력: if 0,0 return false else return true
print()
print(v1,v2,v3) #출력: Vector(5,7) Vector(25,30) Vector(0,0)
print(v1+v2) #출력:Vector(30,37)
print(v1*3) # 출력: Vector(15,21)
print(v2*10) #출력: Vector(250,300)
print(bool(v1),bool(v2),bool(v3)) #출력: True True False
'PYTHON Programming > Python' 카테고리의 다른 글
[python] 상속 (0) | 2024.05.20 |
---|---|
[python] 메서드 (0) | 2024.05.20 |
[python] 클래스 (0) | 2024.05.11 |
[python] 입출력 (0) | 2024.04.23 |
[python] 함수 (0) | 2024.04.23 |