#set document(title: "11.2 Classes and instances", author: "OpenStax / XYZ Homework") #set page(width: 8.5in, height: auto, margin: 1in) #import "@preview/cetz:0.5.2" #set text(font: ("STIX Two Text", "Libertinus Serif", "New Computer Modern"), size: 10.5pt, lang: "en") #show math.equation: set text(font: ("STIX Two Math", "New Computer Modern Math")) #set par(justify: true, leading: 0.62em, spacing: 0.9em) #set enum(spacing: 1.1em) // room between list items so tall inline fractions don't collide #set list(spacing: 1.1em) #set table(stroke: 0.5pt + rgb("#c7ccd3")) #let BLUE = rgb("#183B6F") // brand navy — section bars + example/solution labels (white on navy 11.09:1) #let ORANGE = rgb("#A94509") // brand primary-700 — AA-safe deep orange for TEXT (5.93:1 on white; raw brand #F37021 is 2.94:1 and must never carry text) #let RED = rgb("#DC2626") // brand error-600 #let GREEN = rgb("#059669") // brand success-600 (decoration only; small green text uses green-text #007942) #show heading.where(level: 1): it => block(width: 100%, above: 0pt, below: 16pt, fill: gradient.linear(BLUE, rgb("#2C5AA0")), inset: (x: 14pt, y: 12pt), radius: 3pt, text(fill: white, weight: "bold", size: 19pt, it.body)) #show heading.where(level: 2): it => block(width: 100%, above: 18pt, below: 10pt, fill: BLUE, inset: (x: 10pt, y: 6pt), radius: 2pt, text(fill: white, weight: "bold", size: 12pt, it.body)) #show heading.where(level: 3): it => text(fill: ORANGE, weight: "bold", size: 12.5pt, it.body) #show heading.where(level: 4): it => text(fill: BLUE, weight: "bold", size: 10.5pt, it.body) #let examplebox(label, title, body) = block(width: 100%, breakable: true, fill: rgb("#EFF1F5"), stroke: 0.5pt + rgb("#CFDDF0"), radius: 4pt, inset: 10pt, above: 12pt, below: 12pt)[ #block(below: 6pt)[#box(fill: BLUE, inset: (x: 6pt, y: 2pt), radius: 2pt, text(fill: white, weight: "bold", size: 8.5pt, label)) #h(0.4em) #strong[#title]] #body] // rail = decorative left rule (raw brand token); labelcolor = AA-safe label text shade #let notebox(label, rail, labelcolor, tint, body) = block(width: 100%, breakable: true, fill: tint, stroke: (left: 3pt + rail), inset: (left: 10pt, rest: 8pt), radius: (right: 4pt), above: 11pt, below: 11pt)[ #text(fill: labelcolor, weight: "bold", size: 7.5pt, tracking: 0.5pt)[#upper(label)] #linebreak() #body] #let solutionbox(body) = block(above: 4pt, below: 8pt)[ #text(fill: BLUE, weight: "bold", size: 8.5pt)[Solution] #linebreak() #body] #let figph(msg) = block(width: 100%, height: 60pt, fill: rgb("#f6f7f9"), stroke: (paint: rgb("#c7ccd3"), dash: "dashed"), radius: 4pt, inset: 10pt)[ #align(center + horizon, text(fill: rgb("#889"), style: "italic", size: 9pt, msg))] // Standardize inlined figure sizes: measure the natural CeTZ canvas, then scale to a // consistent envelope (aspect-aware; see build_typst.py FIG_* constants). Unlike the // print preamble, dimensions are FLOORED: in an editor a user can trim a figure to a // degenerate 1-D shape (a bare line), and w/h or tw/w would then divide by zero. #let _STD_W = 3.5 #let _WIDE_W = 5.6 #let _MAX_H = 3.4 #let _ASPECT_WIDE = 2.2 #let _UPSCALE_MAX = 1.15 #let stdfig(body) = context { let m = measure(body) let w = calc.max(m.width / 1in, 0.01) let h = calc.max(m.height / 1in, 0.01) let tw = if w / h > _ASPECT_WIDE { _WIDE_W } else { _STD_W } let s = calc.min(tw / w, _MAX_H / h, _UPSCALE_MAX) align(center, box(scale(x: s * 100%, y: s * 100%, reflow: true, body))) } #show figure: set block(breakable: false) #set figure(gap: 8pt) #show figure.caption: set text(size: 8.5pt, fill: rgb("#555")) == 11.2#h(0.6em)Classes and instances === Learning objectives By the end of this section you should be able to - Create a class with instance attributes, class attributes, and the \_\_init\_\_() method. - Use a class definition to create class instances to represent objects. === Classes and instances In the previous section, a real-world entity, like a person's social media profile, was modeled as a single object. How could a programmer develop a software system that manages millions of profiles? A blueprint that defines the fields and procedures of a profile would be crucial. In a Python program, a #strong[class] defines a type of object with attributes (fields) and methods (procedures). A class is a blueprint for creating objects. Individual objects created of the class type are called #strong[instances]. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Representing a coffee order with a class] #link("https://www.openstax.org/r/representing-with-class")[Representing a coffee order with a class; ch 11, video 4] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Classes and instances] Consider the example below: class Cat:   def \_\_init\_\_(self):     self.name = 'Kitty'     self.breed = 'domestic short hair'     self.age = 1   def print\_info(self):     print(self.name, 'is a ', self.age, 'yr old', self.breed) pet\_1 = Cat() pet\_2 = Cat() ] === Creating instances with \_\_init\_\_() \_\_\_init\_\_\_() is a special method that is called every time a new instance of a class is created. #strong[self] refers to the instance of a class and is used in class methods to access the specific instance that called the method. \_\_init\_\_() uses self to define and initialize the instance's attributes. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Creating multiple coffee orders and changing attributes] #link("https://www.openstax.org/r/creating-changing-attributes")[Creating multiple coffee orders and changing attributes; ch 11, video 5] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[instances and \_\_init\_\_()] Consider the example below: class Rectangle:   def \_\_init\_\_(self):     self.length = 1     self.width = 1   def area(self):     return self.length \* self.width room\_1 = Rectangle() room\_1.length = 10 room\_1.width = 15 print("Room 1's area:", room\_1.area()) room\_3 = Rectangle() room\_3.length = 12 room\_3.width = 14 print("Room 3's area:", room\_3.area()) ] === Instance attributes vs. class attributes The attributes shown so far have been instance attributes. An #strong[instance attribute] is a variable that is unique to each instance of a class and is accessed using the format instance\_name.attribute\_name. Another type of attribute, a #strong[class attribute], belongs to the class and is shared by all class instances. Class attributes are accessed using the format class\_name.attribute\_name. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Using class attributes for shared coffee order information] #link("https://www.openstax.org/r/using-class-attributes")[Using class attributes for shared coffee order information; ch 11, video 6] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Instances and class attributes] Consider the example above. ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Creating a class for an airline's flight tickets] Write a class, FlightTicket, as described below. Default values follow the attributes. Then create a flight ticket and assign each instance attribute with values read from input. Instance attributes: - flight\_num: 1 - airport: JFK - gate: T1-1 - time: 8:00 - seat: 1A - passenger: unknown Class attributes: - airline: Oceanic Airlines - airline\_code: OA Method: - \_\_init\_\_(): initializes the instance attributes - print\_info(): prints ticket information (provided in template) Given input: 2121 KEF D22B 11:45 12B Jules Laurent The output is: Passenger Jules Laurent departs on flight \# 2121 at 11:45 from KEF D22B in seat 12B \# Define FlightTicket class def print\_info(self): print('Passenger ', self.passenger, 'departs on flight \#', self.flight\_num, 'at', self.time, 'from', self.airport, self.gate, 'in seat', self.seat) \# Create ticket\_1 and read in new values ticket\_1.print\_info() ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Creating a class for fantasy books] Write a class, Book, as described below. Then create two instances and assign each instance attribute with values read from input. Instance attributes: - title: '' - author: '' - year: 0 - pages: 0 Class attribute: - imprint: Fantasy Tomes Method: - \_\_init\_\_(): initializes the instance attributes - print\_info(): prints book information (provided in template) Given input: Lord of the Bracelets Blake R. R. Brown 1999 423 A Match of Thrones Terry R. R. Thomas 2020 761 The output is: Lord of the Bracelets by Blake R. R. Brown published by Fantasy Tomes in 1999 with 423 pages A Match of Thrones by Terry R. R. Thomas published by Fantasy Tomes in 2020 with 761 pages \# Define Book class def print\_info(self): print(self.title, 'by', self.author, 'published by', self.imprint, 'in', self.year, 'with', self.pages, 'pages') \# Create book\_1 and read in new values book\_1.print\_info() \# Create book\_2 and read in new values book\_2.print\_info() ]