Menu
CoddyTech

魔术方法简介

本课属于 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 的风格,也更直观易用。

challenge icon

挑战

简单

在这个挑战中,你将实现一个包含魔术方法的 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Python 在线编译器