魔术方法简介
本课属于 Coddy Python 学习旅程的“面向对象编程”单元。第 33 课,共 64 课。
魔术方法(也称为双下划线方法)是开头和结尾都有双下划线的特殊方法。Python 会在执行某些操作时自动调用它们。
下面是一个包含魔术方法的类的示例:
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"{self.title} by {self.author}"创建对象时,会自动调用 __init__ 方法:
my_book = Book("Python Programming", "John Smith", 350)将对象转换为字符串时,会自动调用 __str__ 方法:
print(my_book) # 自动调用 __str__
print(str(my_book)) # 也会调用 __str__输出:
Python Programming by John Smith
Python Programming by John Smith如果没有 __str__,打印对象时会显示它在内存中的位置:
class SimpleBook:
def __init__(self, title):
self.title = title
simple = SimpleBook("Test Book")
print(simple) # <__main__.SimpleBook object at 0x...>再添加一个用于获取长度的魔术方法:
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"{self.title} by {self.author}"
def __len__(self):
return self.pages
my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book)) # 自动调用 __len__输出:
350要点:魔术方法以双下划线开头和结尾(__method__),并由 Python 自动调用。它们可以让你的对象与 str()、len() 等内置函数和运算符配合使用,让你的类更符合 Python 的风格,也更直观易用。
挑战
简单在这个挑战中,你将实现一个包含魔术方法的 Counter 类。
counter.py:这是你需要编辑的文件,其中包含用于指导你实现代码的 TODO 注释driver.py:包含大量测试用例
在counter.py 中实现 Counter 类,并按照 TODO 注释在 driver.py 中编写测试用例。这个类应支持使用可选值进行初始化、字符串表示和加法运算。
亲手试试
# TODO: 从 counter.py 导入 Counter 类
# 使用以下格式:from counter import Counter
# 综合测试用例处理程序
test_case = input()
if test_case == "init_test":
# TODO: 测试使用默认值初始化
# 创建一个不传参数的计数器并打印它
# 预期输出:"Count: 0"
pass
elif test_case == "init_with_value":
# TODO: 测试使用指定值初始化
# 创建一个初始值为 10 的计数器并打印它
# 注意:print() 会隐式调用 __str__,但这里重点测试的是 __init__
# 预期输出:"Count: 10"
pass
elif test_case == "addition":
# TODO: 测试加法运算
# 创建一个值为 3 的计数器,给它加上 7,然后打印结果
# 预期输出:"Count: 10"
pass
elif test_case == "chained_addition":
# TODO: 测试连续加法运算
# 创建一个值为 1 的计数器,加上 2,再给结果加上 3,然后打印出来
# 预期输出:"Count: 6"
pass
elif test_case == "negative_values":
# TODO:测试负值
# 创建一个值为 -5 的计数器并打印出来
# 然后给它加上 -3,并打印结果
# 预期输出:"Count: -5" 和 "Count: -8"
pass
elif test_case == "zero_value":
# TODO:测试值为零的情况
# 创建一个值为 0 的计数器,加上 0,然后打印出来
# 预期输出:"Count: 0"
pass
elif test_case == "large_values":
# TODO:测试较大的值
# 创建一个值为 1000000 的计数器,并加上 9000000
# 预期输出:"Count: 10000000"
pass
elif test_case == "multiple_counters":
# TODO:测试多个计数器之间的交互
# 创建值为 5 的 counter1 和值为 10 的 counter2
# 打印这两个计数器
# 预期输出:"Count: 5" 和 "Count: 10"
pass
elif test_case == "type_validation":
# TODO: 测试添加不同数据类型的值
# 尝试给值为 5 的计数器加上浮点数(2.5)
# 预期输出:"Count: 7.5"
pass这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Python 在线编译器