Summary
In this chapter, we looked at decorators, discovered their purpose, and covered a few examples using one or more at the same time. We also saw decorators that take arguments, which are usually used as decorator factories.
We have scratched the surface of object-oriented programming in Python. We covered all the basics, so you should now be able to understand the code that will come in future chapters. We talked about all kinds of methods and attributes that you can write in a class; we explored inheritance versus composition, method overriding, properties, operator overloading, and polymorphism.
At the end, we very briefly touched on iterators, which should enrich your understanding of generators.
In the next chapter, we are going to learn about exceptions and context managers.