Built-in data structures are the most generic data types, and we can use them no matter what kind of application we’re building. Despite the prevalence of these data types, their generic nature doesn’t allow us to define customized data and operations for these objects. Thus, we must almost always define our own classes. In these classes, we define a variety of attributes, giving us compartments to store customized data and a series of methods to perform customized operations. With the increasing complexity of our application, we define multiple classes, and we need to ensure that these classes work coherently and collectively. As you can imagine, defining well-behaved classes to serve an application is a challenging task. In this part, you’ll learn the essential techniques for defining custom classes.