Upgrade to Pro — share decks privately, control downloads, hide ads and more …

pyohio magic methods

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for darshan darshan
July 25, 2019
65

pyohio magic methods

Slides for my presentation at PyOhio 2019.

Avatar for darshan

darshan

July 25, 2019

Transcript

  1. Groups of Magic Methods 4 Define Custom Behaviour 4 Enable

    Operator Overloading 4 Emulate Built in types 5
  2. Sample Code class Cart: def __init__(self, user_id): self.user_id = user_id

    # mapping of item_name -> Item object self.cart_items = dict() def add_item(self, name): self.cart_items[name] = Item(name) class Item: def __init__(self, name): self.name = name 6
  3. >>> cart_1 = Cart("user_id_1") >>> cart_1.add_item("milk") >>> print(cart_1) <__main__.Cart object

    at 0x10c7f6ef0> >>> print(cart_1.cart_items) {'milk': <__main__.Item object at 0x10944b940>} 7
  4. >>> cart_1 = Cart("user_id_1") >>> cart_1.add_item("milk") >>> print(cart_1) Cart('user_id_1') >>>

    "String Formatting: {0}".format(cart_1) 'String Formatting: Cart of (user_id_1)' Define Custom Behavior 11
  5. >>> cart_1 = Cart("user_id_1") >>> cart_1.add_item("milk") >>> if cart_1: print("Cart

    contains at least 1 item.") else: print("Cart is empty.") "Cart contains at least 1 item." Define Custom Behavior 14
  6. Method Invocation __hash__ hash(object) __str__ str(object) __del__ del object* Define

    Custom Behavior; *: called when reference count reaches 0 15
  7. class Cart: . . def __gt__(self, other): return len(self.cart_items) >

    len(other.cart_items) . . Enable Operator Overloading 18
  8. >>> cart_1 = Cart("user_id_1") >>> cart_2 = Cart("user_id_2") >>> cart_1.add_item("milk")

    >>> cart_2.add_item("milk") >>> cart_1 > cart_2 False >>> cart_1.add_item("eggs") >>> cart_1 > cart_2 True Enable Operator Overloading 19
  9. Other Comparison Methods Method Invocation __ge__ self >= other __lt__

    self < other __le__ self <= other __eq__ self == other __ne__ self != other Enable Operator Overloading 20
  10. import functools @functools.total_ordering class Cart: . . def __gt__(self, other):

    return len(self.cart_items) > len(other.cart_items) def __eq__(self, other): return len(self.cart_items) == len(other.cart_items) . . Enable Operator Overloading 22
  11. >>> cart_1 = Cart("user_id_1") >>> cart_2 = Cart("user_id_2") >>> cart_1.add_item("milk")

    >>> cart_2.add_item("milk") >>> cart_1 < cart_2 False >>> cart_1 >= cart_2 True Enable Operator Overloading 23
  12. class Cart: . . def __add__(self, other): new_cart = Cart(self.user_id)

    for item in self.cart_items: new_cart.add_item(item) for item in other.cart_items: new_cart.add_item(item) return new_cart . . Enable Operator Overloading 25
  13. >>> cart_1 = Cart("user_id_1") >>> cart_2 = Cart("user_id_2") >>> cart_1.add_item("milk")

    >>> cart_2.add_item("eggs") >>> cart_3 = cart_1 + cart_2 >>> for item in cart_3.cart_items: print(item) 'milk' 'eggs' Enable Operator Overloading 26
  14. Other arithmatic magic methods Method Invocation __sub__ self - other

    __mul__ self * other __div__ self / other __pow__ self ** other Enable Operator Overloading 27
  15. Reflected numerical magic methods Method Invocation __radd__ other + self

    __rsub__ other - self __rmul__ other * self __rdiv__ other / self __rpow__ other ** self Enable Operator Overloading 28
  16. class Cart: . . def __contains__(self, key): return key in

    self.cart_items . . Emulate Container Types 36
  17. >>> cart_1 = Cart("user_id_1") >>> cart_1.add_item("milk") >>> cart_1.add_item("eggs") >>> print("eggs"

    in cart_1) True >>> print("cheese" in cart_1) False Emulate Container Types 37
  18. class Cart: . . def __iter__(self): for item in self.cart_items:

    yield item . . Emulate Container Types 39
  19. >>> cart_1 = Cart("user_id_1") >>> cart_1.add_item("milk") >>> cart_1.add_item("eggs") >>> for

    item in cart_1: print(item) 'milk' 'eggs' Emulate Container Types 40
  20. Related Magic Methods Method Name Similar __setitem__ self[key] = value

    __delitem__ del(self[key]) Emulate Container Types 44
  21. >>> from collections import abc >>> isinstance(list(), abc.Sequence) True >>>

    isinstance(dict(), abc.Mapping) True >>> isinstance(list(), abc.Hashable) False >>> isinstance(str(), abc.Hashable) True 48
  22. from collections import abc class Cart(abc.Mapping): . . def __iter__(self):

    for key in self.cart_items: yield key def __len__(self): return len(self.cart_items) def __getitem__(self, key): return self.cart_items[key] . . 50
  23. file_handle = open("/path/to/file") try: content = file_handle.read() finally: file_handle.close() with

    open("/path/to/file") as file_handle: content = file_handle.read() 54
  24. class FileReader: def __init__(self, filename): self.filename = filename def __enter__(self):

    self.file_handle = open(self.filename) return self.file_handle def __exit__(self, exc_type, exc_value, traceback): if self.file_handle: self.file_handle.close() with FileReader("/path/to/file") as file_handle: content = file_handle.read() 56
  25. Resources 4 Python Data Model Documentation 4 Python collections module

    documentation 4 A guide to Python's Magic Methods 58