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)'


Tags:

Categories:

Updated: