In previous chapters, we've covered many of the defining features of object-oriented programming. We now know the principles and paradigms of object-oriented design, and we've covered the syntax of object-oriented programming in Python.
Yet, we don't know exactly how and when to utilize these principles and syntax in practice. In this chapter, we'll discuss some useful applications of the knowledge we've gained, picking up some new topics along the way:
How to recognize objects
Data and behaviors, once again
Wrapping data in behavior using properties
Restricting data using behavior
The Don't Repeat Yourself principle
Recognizing repeated code