10.13.1 Creating a Card Data Class

Importing from the dataclasses and typing Modules

  • dataclasses module defines decorators and functions for implementing data classes
  • @dataclass decorator specifies that a new class is a data class and causes various code to be written for you
  • ClassVar and List from the typing module will indicate that FACES and SUITS are class variables that refer to lists
# carddataclass.py
"""Card data class with class attributes, data attributes, 
autogenerated methods and explicitly defined methods."""
from dataclasses import dataclass
from typing import ClassVar, List

Using the @dataclass Decorator

  • To specify that a class is a data class, precede its definition with the @dataclass decorator:
@dataclass
class Card:
  • The decorator @dataclass(order=True) would cause the data class to autogenerate overloaded comparison operator methods for <, <=, > and >=
    • Useful if you need to compare or sort your data-class objects

Variable Annotations: Class Attributes

  • Data classes declare both class attributes and data attributes inside the class, but outside the class’s methods
  • Data classes require additional information, or hints, to distinguish class attributes from data attributes
    • Also affects the autogenerated methods’ implementation details
FACES: ClassVar[List[str]] = ['Ace', '2', '3', '4', '5', '6', '7', 
                                  '8', '9', '10', 'Jack', 'Queen', 'King']
    SUITS: ClassVar[List[str]] = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
  • The variable annotation : ClassVar[List[str]] (sometimes called a type hint) specifies that FACES is a class attribute (ClassVar) which refers to a list of strings (List[str]).
  • SUITS also is a class attribute which refers to a list of strings
  • Class variables are initialized in their definitions and are specific to the class, not individual objects of the class
  • Methods __init__, __repr__ and __eq__, however, are for use with objects of the class
    • When a data class generates these methods, it inspects all the variable annotations and includes only the data attributes in the method implementations

Variable Annotations: Data Attributes

  • Normally, we create an object’s data attributes in the class’s __init__ method
  • We cannot simply place data attribute names inside a class, which generates a NameError, as in:
In [1]:
from dataclasses import dataclass
In [2]:
@dataclass
class Demo:
    x  # attempting to create a data attribute x
------------------------------------------------------------------------
NameError                              Traceback (most recent call last)
<ipython-input-2-1012c99a8f21> in <module>
----> 1 @dataclass
      2 class Demo:
      3     x  # attempting to create a data attribute x

<ipython-input-2-1012c99a8f21> in Demo()
      1 @dataclass
      2 class Demo:
----> 3     x  # attempting to create a data attribute x

NameError: name 'x' is not defined
  • Like class attributes, each data attribute must be declared with a variable annotation
  • The variable annotation ": str" indicates face and suit should refer to string objects

Defining a Property and Other Methods

  • Data classes are classes, so they may contain properties and methods and participate in class hierarchies
@property
    def image_name(self):
        """Return the Card's image file name."""
        return str(self).replace(' ', '_') + '.png'

    def __str__(self):
        """Return string representation for str()."""
        return f'{self.face} of {self.suit}'

    def __format__(self, format):
        """Return formatted string representation."""
        return f'{str(self):{format}}'

Variable Annotation Notes

  • Even with type annotations, Python is still a dynamically typed language
  • So, type annotations are not enforced at execution time

©1992–2020 by Pearson Education, Inc. All Rights Reserved. This content is based on Chapter 5 of the book Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud.

DISCLAIMER: The authors and publisher of this book have used their best efforts in preparing the book. These efforts include the development, research, and testing of the theories and programs to determine their effectiveness. The authors and publisher make no warranty of any kind, expressed or implied, with regard to these programs or to the documentation contained in these books. The authors and publisher shall not be liable in any event for incidental or consequential damages in connection with, or arising out of, the furnishing, performance, or use of these programs.