# 매직메소드 실습
# 파이썬의 중요한 핵심 프레임워크 -> 시퀀스(Sequence), 반복(Iterator), 함수(Functions), 클래스(Class)
# 매직메소드 기초 설명
# 기본형
print(int) # <class 'int'> 파이썬의 모든 데이터는 객체 타입이다.
# 모든 속성 및 메소드 출력
print(dir(int))
#['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__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__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
n = 100
# 사용
print('EX1-1 -', n + 200) # EX1-1 - 300
print('EX1-2 -', n.__add__(200)) # EX1-2 - 300
## 더하기 기호를 붙이면 파이썬에서 자동으로 __add__를 실행한다.
print('EX1-3 -', n.__doc__)
# EX1-3 - int([x]) -> integer
int(x, base=10) -> integer
# EX1-3 - 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. .......
# 파이썬을 만들 때 적은 주석이 나온다.
print('EX1-4 -', n.__bool__(), bool(n)) # __bool__()과 bool(n)은 같다.
print('EX1-5 -', n * 100, n.__mul__(100))
# 클래스 예제1
class Student():
def __init__(self, name, height):
self._name = name
self._height = height
def __str__(self):
return 'Student Class Info : {}, {}'.format(self._name, self._height)
def __ge__(self, x):
print('CAlled. >> __ge__Method.')
if self._height >= x._height:
return True
else:
return False
def __le__(self, x):
print('CAlled. >> __le__Method.')
if self._height <= x._height:
return True
else:
return False
def __sub__(self, x):
print('CALLED. >> __sub__Method.')
return self._height - x._height
# 인스턴스 생성
s1 = Student('james', 181)
s2 = Student('mie', 165)
# 매직메소드 출력
print('EX2-1 -', s1 >= s2) # <= 를 메소드로로 구현했기 때문에 원래 안되는 연산인데 가능하다.
# __le__, __ge__ 는 원래 있는 함수다. 부호를 사용하니까 저 함수가 호출됐다.
# CAlled. >> __ge__Method.
# EX2-1 - True
print('EX2-2 -', s1 <= s2)
# CAlled. >> __le__Method.
# EX2-2 - False
print('EX2-3 -', s1 - s2)
# CALLED. >> __sub__Method.
# EX2-3 - 16
print('EX2-4 -', s2 - s1)
# CALLED. >> __sub__Method.
# EX2-4 - -16
object.__lt__(self, other)
object.__ __le____(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
These are the so-called “rich comparison” methods. The correspondence between operator symbols and method names is as follows: x<y calls x.lt(y), x<=y calls x.le(y), x==y calls x.eq(y), x!=y calls x.ne(y), x>y calls x.gt(y), and x>=y calls x.ge(y).출처:https://docs.python.org/3/reference/datamodel.html#special-method-names
class Vector(object):
def __init__(self, *args):
'''Create a vector, example : v = Vector(1,2)'''
if len(args) == 0:
self._x, self._y = 0, 0
else:
self._x, self._y = args
def __repr__(self):
'''Returns the vector informations'''
return 'Vector(%r, %r)' % (self._x, self._y)
def __add__(self, other):
'''Returns the vector addition of self and other'''
return Vector(self._x + other._x, self._y + other._y)
def __mul__(self, y):
return Vector(self._x * y, self._y * y)
def __bool__(self):
return bool(max(self._x, self._y))
# Vector 인스턴스 생성
v1 = Vector(3,5)
v2 = Vector(15,20)
v3 = Vector()
# 매직메소드 출력
print('EX3-1 -', Vector.__init__.__doc__) # EX3-1 - Create a vector, example : v = Vector(1,2)
print('EX3-2 -', Vector.__repr__.__doc__) # EX3-2 - Returns the vector informations
print('EX3-3 -', Vector.__add__.__doc__) # EX3-3 - Returns the vector addition of self and other
print('EX3-4 -', v1,v2,v3) # EX3-4 - Vector(3, 5) Vector(15, 20) Vector(0, 0)
print('EX3-5 -', v1 + v2) # EX3-5 - Vector(18, 25)
print('EX3-6 -', v1 * 4) # EX3-6 - Vector(12, 20)
print('EX3-7 -', v2 * 10) # EX3-7 - Vector(150, 200
print('EX3-8 -', bool(v1), bool(v2)) # EX3-8 - True True
print('EX3-9 -', bool(v3)) # EX3-9 - False
self._x, self._y = args
인자를 정의해주었다.