Fluent Python Ch01
( 출처 : 전문가를 위한 파이썬 / Fluent Python )
[ The Python Data Model ]
기존의 다른 객체지향언어와 다르게, python은
1)뿐만 아니라, 2)로도 이용 가능!
- 1)
collection.len()
- 2)
len(collection)
그 밖의 예시
my_collection.__getitem__(key)
대신,my_collection[key]
도 가능하다
1. A pythonic card deck
2가지의 강력한 special method :
- 1)
__getitem__
- 2)
__len__
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits
for rank in self.ranks]
# 1) SPECIAL METHOD 1
def __len__(self):
return len(self._cards)
# 2) SPECIAL METHOD 2
def __getitem__(self, position):
return self._cards[position]
-
collections.namedtuple
를 사용하여 class를 만든다. -
example
>>> beer_card = Card('7', 'diamonds') >>> beer_card Card(rank='7', suit='diamonds')
>>> deck = FrenchDeck() >>> len(deck) 52
>>> deck[0] Card(rank='2', suit='spades') >>> deck[-1] Card(rank='A', suit='hearts')
Special method를 사용하는 2가지 장점
- 1) method 이름들 다 외울 필요 X
.size()
인지,.length()
인지 등등
- 2) Python standard library 효과 UP
__getitem__
대신 []
-
1) slicing이 가능
example )
>>> deck[:3] [Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]
-
2) iterable ( + reversible )
example )
>>> for card in reversed(deck): print(card) Card(rank='A', suit='hearts') Card(rank='K', suit='hearts') Card(rank='Q', suit='hearts')
__contains__
가 없다면, in
으로 가능!
>>> Card('Q', 'hearts') in deck
True
2. How Special Methods are used
SPECIAL METHODS : meant to be called by the Python interpreter ,not by me!
우리가 직접 불러올때, 주로
my_object.__len__()
보다는len(my_object)
를 많이 사용한다
( 우리가 직접 사용하게 되는 유일한 special method는 __init__
뿐이다 )
3. Emulating Numeric Types
from math import hypot
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return 'Vector(%r, %r)' % (self.x, self.y)
def __abs__(self):
return hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
__repr__
: String Representation
>>> v = Vector(3, 4)
>>> v
Vector(3, 4)
>>> str(v)
'Vector(3, 4)'