Classes and Methods#
We can define classes in Python. Classes are defined globally, within the file/module as they begin in column 0.
Within a class its functions are called methods. Unlike functions, methods are defined within the scope of the class and are therefore indented within the class's block.
A class has a constructor, a special method named __init__. The constructor is called when you create a new object of the class. It can be said that the new object has a type of its class. 
All special methods in Python are surrounded by double underscores. (There are more of these but we'll get to them later.)
boo.py 
class Boo:
    __init__(self):
        print('boo!')
 
Now let's enter the Python REPL and use our new class:
/pyboard> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.25.0 on 2025-04-15; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> 
>>> from boo import Boo
>>> b = Boo()
boo!
>>> 
>>> print(b)
<Boo object at 20005f50>
>>>
>>> print(type(b))
<class 'Boo'>
>>> 
 
What did we do? 
After creating a class named 
Boo,
- we imported the class ("from boo import Boo") so the interpreter was aware of it,
- then we instantiated (created an instance of) an object of the Boo class ("b = Boo()") and we assigned the object a name "b". Notice that when we created the object, the print line in Boo's constructor was executed ("boo!")
- then we printed the object (the interpreter returned a default result "<Boo object at 20005f50>"),
- then we printed the type of the object ("print(type(b))")
 
motor_controller.py 
from motor import Motor
class MotorController:
    def __init__(self):
      self.port_forward_motor = Motor('pfwd')
      self.stbd_forward_motor = Motor('sfwd')
      print('motor controller ready.')
motor.py 
class Motor:
    def __init__(self, name):
        self.motor_name = name
        self.motor_speed = 0
        print('motor {} ready.'.format(self.motor_name))
        
    def set_speed(self, speed):
        self.motor_speed = speed
        print("speed: {}".format(speed))
    def get_speed(self):
        return self.motor_speed
main.py 
from motor_controller import MotorController
try:
    motor_ctrl = MotorController()
except Exception as ex:
    print('an error occurred: {}'.format(ex))
finally:
    print('complete.')
Previous: MicroPython Tutorial Exercise 3: functions 
Next: MicroPython Tutorial Exercise 5: using classes