Insight
1. 코딩을 할때 명확한 나의 의도대로 동작하지 않을 때가 있다.
내가 부딫힌 부분은 bool()함수 였다.
2. 시야를 넗게, 여러 가능성을 두고 확장하는 것이 soft skill을 늘릴 수 있다는 것을 깨달았다.
3. class내 init을 분기해 메소드 오버 로딩(같은 메서드 이름 , 다른 파라미터를 받을 수 있는 개념)처럼 꾸밀수 있다.
init에 분기되는 x,y를 담는 속성과 과 repr로 출력하는 매직메서드를 생성합니다.
init에 분기문은 오버 로딩 처럼 구현해 보겠습니다. (JAVA처럼 파이썬에서는 지원하지 못합니다)
추가로 파이썬의 object를 상속하는 함수를 만들어 보겠습니다.
class XY(object):
def __init__(self, *args):
'''init function, put XY(x,y) or empty XY()'''
if len(args) == 0:
self._x, self._y = 0, 0
else :
self._x, self._y = args
def __repr__(self):
return 'Vactor(%r, %r)' % (self._x, self._y)
v1 = XY(10, 20)
v2 = XY(20, 40)
v3 = XY()
print(XY.__init__.__doc__) # init function, put XY(x,y) or empty XY()
print(v1, v2, v3) # Vactor(10, 20) Vactor(20, 40) Vactor(0, 0) 로 출력이 된다.
print(dir(v3))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
# '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
# '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_x', '_y']
directory()내에 없으므로 *연산자(__mul__) 사용하지 못한다.
print(v1 * v2) # TypeError: unsupported operand type(s) for *: 'XY' and 'XY'
def __mul__(self,x,y): 이런식으로 선언이 필요하다.
신기한건 __bool__ 내장메서드는 없는데 bool() 돌아간다.
# v3라는 객체가 존재하는지 아닌지를 판별하는 것 같다.
print(bool(v3)) # True
print(v3.__bool__()) 당연히 매직 메서드로 접근하려고 하면 attribute '__bool__' 이 없다고 한다
조금 tricky한 거 같다.
그래서 실제 __bool__내장 매직 메서드를 가지는 객체를 만들고 __bool__과 __doc__을 확인해 보겠다.
a = True
print(a.__bool__()) #True
print(a.__bool__.__doc__) # self != 0
결론은 위의 bool(v3)는 클래스 내장 매직 메소드로 실행 되는 것이 아닌 전역 변수 영역에서 실행되는 내장 메소드인 것이다.
'Language > Python' 카테고리의 다른 글
RePythonOOP 10일차 파이썬 tuple comprehension, array comprehension (0) | 2019.12.08 |
---|---|
RePythonOOP 9일차 파이썬 컨테이너 VS 플랫, 가변 VS 불변, 리스트 컴프리 핸션 (0) | 2019.12.07 |
RePythonOOP 7일차 매직메소드 오버라이딩 (0) | 2019.12.05 |
RePythonOOP 6일차 네임드 튜플 클래스 응용 해 보기 (0) | 2019.12.04 |
RePythonOOP 4일차 파이썬의 데이터 모델 , 네임드 튜플 , 속성과 메소드 들 (0) | 2019.11.30 |