Python · Classes and OOP
Special Methods
The full text of this chapter, to read or revisit. To practise, do the exercises.
▶ Do the exercisesExercise 1 — What are Special Methods?
You already know `__init__` and `__str__`. These are called special methods (or dunder methods — double underscore). Python has many more! They let your objects work with operators like `+`, `==`, `<`, and even `len()`.
For example, when you write `len([1,2,3])`, Python actually calls the list's `__len__` method. Let's make our objects work the same way!
class Team:
def __init__(self, members):
self.members = members
def __len__(self):
return len(self.members)
team = Team(["Aquachu", "Pyrochu", "Florachu"])
print(len(team))
By defining `__len__`, we can use `len()` on our own objects! Python translates `len(team)` into `team.__len__()`.
Exercise 2 — __eq__ — Equality
By default, `==` checks if two objects are the exact same object in memory, not if they have the same data. `__eq__` lets you define what "equal" means for your class.
class Codemon:
def __init__(self, name, level):
self.name = name
self.level = level
def __eq__(self, other):
return self.name == other.name
a = Codemon("Aquachu", 10)
b = Codemon("Aquachu", 20)
c = Codemon("Pyrochu", 10)
print(a == b)
print(a == c)
Now `==` checks if two Codémon have the same name, regardless of level. You decide what "equal" means!
Exercise 3 — __eq__ Behavior
class Codemon:
def __init__(self, name, level):
self.name = name
self.level = level
def __eq__(self, other):
return self.level == other.level
a = Codemon("Aquachu", 10)
b = Codemon("Pyrochu", 10)
print(a == b)
Options
• True
• False
• Error
• None
Hint : This `__eq__` compares levels, not names. Do both Codémon have the same level?
Exercise 4 — __lt__ — Less Than
`__lt__` defines the `<` operator. (lt = less than). This also makes `sorted()` work on your objects!
class Codemon:
def __init__(self, name, level):
self.name = name
self.level = level
def __lt__(self, other):
return self.level < other.level
def __str__(self):
return f"{self.name} (Lv.{self.level})"
team = [Codemon("Pyrochu", 25), Codemon("Aquachu", 10), Codemon("Florachu", 15)]
team.sort()
for myCdm in team:
print(myCdm)
By defining `__lt__`, Python can sort our Codémon by level! `sorted()` and `.sort()` both use `<` under the hood.
Exercise 5 — Define __len__
Complete the `__len__` method so `len(team)` returns the number of Codémon.
class Team:
def __init__(self, members):
self.members = members
def ____(self):
return len(self.____)
team = Team(["Aquachu", "Pyrochu"])
print(len(team))
Options: __len__ __str__ members self team
Hint : The special method for `len()` has double underscores around "len". It returns the count of the internal list.
Exercise 6 — __add__ — The + Operator
`__add__` defines what `+` does for your objects. You can make it do anything — merge teams, combine stats, etc.
class Team:
def __init__(self, members):
self.members = members
def __add__(self, other):
return Team(self.members + other.members)
def __str__(self):
return ", ".join(self.members)
team1 = Team(["Aquachu", "Pyrochu"])
team2 = Team(["Florachu", "Zap"])
combined = team1 + team2
print(combined)
`team1 + team2` calls `team1.__add__(team2)`. It creates a new Team with all members combined!
Exercise 7 — Define __eq__
Complete `__eq__` so two Codémon are equal if they have the same name and level.
class Codemon:
def __init__(self, name, level):
self.name = name
self.level = level
def __eq__(self, other):
return self.name == other.name and self.____ == other.____
a = Codemon("Aquachu", 10)
b = Codemon("Aquachu", 10)
print(a == b)
Options: level name self other hp level name self other hp
Hint : Both the name AND the level must match for equality.
Exercise 8 — __add__ Result
class Team:
def __init__(self, members):
self.members = members
def __add__(self, other):
return Team(self.members + other.members)
def __len__(self):
return len(self.members)
a = Team(["Aquachu", "Pyrochu"])
b = Team(["Florachu"])
c = a + b
print(len(c))
Hint : `+` combines both teams' members into one new team. Count all members.
Exercise 9 — Special Methods
Match each special method with what it enables.
Items to match
• `__len__`
• `__eq__`
• `__lt__`
• `__add__`
• `__str__`
Definitions
• `len(obj)` — get length
• `obj == other` — equality check
• `obj < other` — less than
• `obj + other` — addition
• `print(obj)` — string display
Exercise 10 — Sort by Level
Complete `__lt__` to sort Codémon by level.
class Codemon:
def __init__(self, name, level):
self.name = name
self.level = level
def ____(self, other):
return self.level ____ other.level
def __str__(self):
return f"{self.name}: Lv.{self.level}"
team = [Codemon("Pyrochu", 25), Codemon("Aquachu", 5)]
team.sort()
for myCdm in team:
print(myCdm)
Options: __lt__ __eq__ < > ==
Hint : "Less than" uses `<`. The dunder method is `__lt__`.
Exercise 11 — Full-featured Team Class
Create a `Team` class with these special methods:
1. `__init__` with a `name` and `members` list
2. `__len__` — returns number of members
3. `__add__` — merges two teams (use the first team's name)
4. `__eq__` — two teams are equal if they have the same members
5. `__str__` — returns `"TeamName: member1, member2"`
6. Test all 4 operations
Starter code
class Team:
# __init__
# __len__
# __add__
# __eq__
# __str__
# Test all operations
Back to the course