1. Object Oriented Programming in Python
    1. Why Object Oriented Programming?
    2. Generic Object Oriented Programming terms
    3. OOP in Python
    4. OOP in Python (numbers, strings, lists)
    5. OOP in Python (argparse)
    6. Create a class
    7. Create instance of class
    8. Import module containing class
    9. Import class from module
    10. Initialize instance (not a constructor)
    11. Self is the instance
    12. Init uses same name as attribute and getters
    13. Initialize an instance - (not a constructor), attributes and getters
    14. Setters - assign to the attributes
    15. Attributes are not special
    16. Private attributes
    17. Methods
    18. Inheritance
    19. Inheritance - another level
    20. Modes of method inheritance
    21. Modes of method inheritance - implicit
    22. Modes of method inheritance - override
    23. Modes of method inheritance - extend
    24. Modes of method inheritance - delegate - provide
    25. Composition - Line
    26. Composition - Line with type annotation
    27. Hidden attributes
    28. Hidden attributes in a subclass
    29. Some comments
    30. Exercise: Add move_rad to based on radians
    31. Exercise: Improve previous examples
    32. Exercise: Polygon
    33. Exercise: Number
    34. Exercise: Library
    35. Exercise: Bookexchange
    36. Exercise: Represent turtle graphics
    37. Solution - Polygon
  2. Advanced OOP
    1. Stringify class
    2. Multiple inheritance
    3. Multiple inheritance - diamond
    4. Interfaces
    5. Abstract Base Class
    6. Abstract Base Class with abc
    7. ABC working example
    8. ABC - cannot instantiate the base-class
    9. ABC - must implement methods
    10. Class Attributes
    11. Class count instances
    12. Destructor: del
    13. Class count instances - decrease also (destructor: del)
    14. Keep track of instances
    15. Keep track of instances properly (weakref)
    16. Destructor delayed
    17. Destructor delayed for both
    18. Class Attributes in Instances
    19. Attributes with method access
    20. Methods are class attributes - add method
    21. Methods are class attributes - replace method
    22. Methods are class attributes - Enhance method (Monkey patching)
    23. Method types
    24. Instance methods
    25. Class methods
    26. Class methods accessing class attributes
    27. Default Constructor
    28. Alternative constructor with class method
    29. Static methods
    30. Module functions
    31. Class and static methods
    32. Special methods
    33. Opearator overloading
    34. Operator overloading methods
    35. Declaring attributes (dataclasses)
    36. Dataclasses and repr
    37. Dataclasses and eq
    38. Dataclasses create init and call post_init
    39. Dataclasses can provide default values to attributes
    40. Dataclasses and default factory
    41. Read only (frozen) Dataclass
    42. Serialization of instances with pickle
    43. Class in function
    44. Exercise: rectangle
    45. Exercise: SNMP numbers
    46. Exercise: Implement a Gene inheritance model combining DNA
    47. Exercise: imaginary numbers - complex numbers
    48. Solution: Rectangle
    49. Solution: Implement a Gene inheritance model combining DNA
    50. Instance Attribute
    51. Use Python @propery to fix bad interface (the bad interface)
    52. Use Python @propery to fix bad interface (first attempt)
    53. Use Python @propery to fix bad API
    54. Use Python @propery decorator to fix bad API
    55. Use Python @propery for value validation
  3. Other
    1. Inheritance - super
    2. Inheritance - super - other class
    3. Abstract Base Class without abc
    4. Abstract Base Class with abc Python 2 ?
    5. Abstract Base Class with metaclass
    6. Abstract Base Class without ABC