오픈소스 기반으로 개발함. 다들 고급기법을 써서 이해하지 못하면 사용을 할 수가 없다.
Ephiphany : 자신도 모르게 깨닫는 것.
class A:
def quark(self):
print('a')
class B:
def quark(self):
print('b')
def x(t):
print(t.quark())
x(A())
x(B())
이렇게 A와 B를 상속하지 않으면서 같은 함수를 만들면서 다른 클래스로 선언할 수 있다. 이런 것을 덕타이핑이라고 한다.
Type 1. 상속
sequence 2. protocol을 따른다.
이터러블이라는 최상위 객체를 상속해서 사용할 수 있고, 덕타이핑을 제공한다.
이터러블이 아닌데도 같은 것을 할 수 있는 경우가 있다. 덕타이핑을 제공하기 때문에...
is.... : True, False 반환 -> predicate라고 한다.
__base__, __bases__ : 부모확인
issubclass() :
isinstance(3, (int, float)) : True
type(3) == int : True
이렇게 클래스의 인스턴스인지 확인할 수 있는 방법이 있다.
두 개 다 사용할 수 있다.
set() - set() : 차집합.
a=5
vars(a) : 타입에러
왜냐하면 a에 __dict__가 정의되어 있지 않기 때문에 내부적으로 변환해서 나오지 못한다.
함수도 객체다.
type, dir, vars : 삼총사 - 내가 뭘 사용할 수 있는지 알 수 있다.
def echo(a=7, b=6):
b = 5
return a
echo.__default__ -> 에코의 기본값들이 나온다.
오버라이딩 가능 : 순수하게 객체니까 모든 객체들을 덮어쓸 수 있다.
class Room:
def __init__(self, door):
self.door = door
def open(self):
self.door.open()
def close(self):
self.door.close()
def is_open(self):
return self.door.is_open()
덕타이핑.
init의 door에 open(), close(), is_open()만 어떻게 있으면 어떤 type의 인스턴스이던 입력할 수 있으며, 에러가 발생하지 않는다.
상속, 컴포지션, 새로 짜는 것 다 가능하다.
상속은 무조건 다 부모를 가져오기 때문에 메모리가 비대해 질 수 있다.
필요한 기능만 따로 있다면 필요한 것만 가지고 오자.
덕타이핑은 실수할 확률이 있다.
하나의 클래스를 변경할 때, 덕타이핑 되어 있는 다른 클래스도 변경해야 한다. 그렇지 못한다면 실수할 확률이 높아진다.
hasattr(3, 'to_bytes') : 파이썬 동네에서 좋아하지 않는다. True, 이건 LBYR
EAFP : 용서를 구하는 것이 허락받는 것 보다 쉬운일이다. 그렇기 때문에 위의 방식이 별로 좋지 않은 방식이다.
try, catch 방식이 더 선호받는다.
if hasattr(someobj, 'open'):
[...]
else:
[...]
위의 방식은 미리 open이라는 함수가 있는지를 들여다보고 가는 것이다. 파이써닉하지 못한 방법이다.
try:
someobj.open()
[...]
except AttributeError:
[...]
클래스 제한 : __ 클래스안에서 사용하면 접근제한자가 된다.
접근 제한 가능.
class Y:
def __init__(self, x):
self.x = x
@property
def x(self):
return self.x
a = Y(3)
AttributeError : attribute를 set할 수 없다.
@property를 이용해서 .의 기능을 바꿀 수 있다. 이런것을 디스크립터라고 부른다.
a.get_x : 3 괄호를 사용하지 않고 쓸 수 있게 된다.
class Y:
def __init__(self, x):
self.x = x
@property
def get_x(self):
return self.x
class X:
def __init__(self, x):
self.x = x
def get_x(self):
return self.x
property가 붙은 것과 property가 붙지 않은 것과는 변한 것이 없다.
a = Y(1)
b = X(2)
len(dir(a))
len(dir(b)) : 둘은 같다.
'노력 > 인공지능' 카테고리의 다른 글
9. 파이썬 개인공부 (복습, 요약) (0) | 2019.03.26 |
---|---|
7. 파이썬 개인공부 7 (객체) (0) | 2019.03.24 |
6. 파이썬 개인공부 6 (함수) (0) | 2019.03.23 |
5. 파이썬 개인공부 5 (함수형 패러다임) (0) | 2019.03.22 |
4. 파이썬 개인공부 4 (반복) (0) | 2019.03.21 |