A class is a named block of code that contains variables and function declarations. The variables are called "properties" or "attributes". The functions declared inside a class are called "methods". A method can return a result like a function but not all methods have results.
We can use a class like a code template to create objects during runtime. Each object is dynamically allocated in memory and it has its own namespace. An object can be a named variable or can be an element into a collection.
Objects are also called "instances" of a class. You can initiate an object using an "object constructor" that is a special method defined in a class, called __init__. It could be called "constructor" but in Python there is a convention to name all private functions with double underscore prefix.
# define a class class Dog: kind = "canine" # class variable def __init__(self, name): self.name = name #instance variable self.tricks =  #instance variable def add_trick(self, trick): self.tricks.append(trick) # instance of a class e = Dog('Buddy') #first instance d = Dog('Fido') #second instance # call methods using objects e and d e.add_trick('roll over') d.add_trick('play dead') # access public property "tricks" print(e.name, e.tricks) print(d.name, d.tricks)
Buddy ['roll over'] Fido ['play dead']
Homework: Open live example and run it: class
A class can inherit from another class called "base class".
#all classes have a common super-class: "object" class Animal(object): def __init__(self, kind): self.kind = kind class Dog(Animal): def __init__(self, name): super().__init__("canine") self.name = name self.tricks = def add_trick(self, trick): self.tricks.append(trick)
Observe: in the constructor of "Dog" we call the super(), this is the super class and __init__() that is the constructor for the base class. The object "Dog" will have all attributes of "Animal" plus some more specific to "Dog" and defined in __init__() constructor.
If the parameter of the class is missing the class will automatically be derived from the most base class, called the "root" class in other languages. This is the "object" class.
Sometimes a developer want's a structure to hold some data. You can do this with a collection but some neat trick is to use a class with attributes. This kind of class do not require an instance. It can be used as an object:
# a simple class class record: pass # define attributes record.type = "url" record.domain = "https://sagecode.net" record.purpose = "Research Laboratory" # print attributes print(record.domain) # instantiation test = record(); print(test.domain);
Note:there is no point to instantiate a class used as record. All instances will have same attributes as the class. These are called class attributes. You can not add new attributes for an object but you can for the class.
Switch statement does not exist in Python.You can simulate a switch statement using different techniques. In the next example we use a class a function and "while" loop to simulate the switch statement. However this switch design is not very efficient and also may be difficult to use.
#define a value holder class class switch(object): value = None def __new__(class_, value): class_.value = value return True # function to verify matching case # => True or False def case(*args): iterator = (arg == switch.value for arg in args) return any(iterator) # Switch example: for n in range(0,10): print(n,":", end="", flush=True) while switch(n): if case(0): print ("n is zero;") break if case(1, 4, 9): print ("n is a perfect square;") if case(2, 4, 6, 8): print ("n is an even number;") if case(2, 3, 5, 7): print ("n is a prime number;") break break pass # end switch pass # end for
Homework: Run this example live: switch class
This example have demonstrate how to use a loop in a smarter way. The trick is to use significant names that "extend" the language. We exploit the fact that "switch" and "case" are not reserved keywords in Python, otherwise this would not work. In other situations you can create "frameworks" specific to your domain, that can be reused in multiple applications, extending the language with"domain specific" functions and classes.