#!/usr/bin/env python # -*- coding: utf-8 -*- # # Related to AboutOpenClasses in the Ruby Koans # from runner.koan import * class AboutMonkeyPatching(Koan): class Dog: def bark(self): return "WOOF" def test_as_defined_dogs_do_bark(self): fido = self.Dog() self.assertEqual('WOOF', fido.bark()) # ------------------------------------------------------------------ # Add a new method to an existing class. def test_after_patching_dogs_can_both_wag_and_bark(self): def wag(self): return "HAPPY" self.Dog.wag = wag fido = self.Dog() self.assertEqual('HAPPY', fido.wag()) self.assertEqual('WOOF', fido.bark()) # ------------------------------------------------------------------ def test_most_built_in_classes_cannot_be_monkey_patched(self): try: int.is_even = lambda self: (self % 2) == 0 except Exception as ex: err_msg = ex.args[0] self.assertRegex(err_msg, "can't set attributes of built-in") # ------------------------------------------------------------------ class MyInt(int): pass def test_subclasses_of_built_in_classes_can_be_be_monkey_patched(self): self.MyInt.is_even = lambda self: (self % 2) == 0 self.assertEqual(False, self.MyInt(1).is_even()) self.assertEqual(True, self.MyInt(2).is_even())
时间: 2023-08-15 22:08:18 浏览: 182
这段代码是一个 Python 的单元测试,测试了 Monkey Patching 的一些特性。Monkey Patching 是指在运行时动态修改类或对象的行为。在这段代码中,定义了一个 Dog 类,其中有一个 bark 方法。然后通过 Monkey Patching 的方式给 Dog 类添加了一个新的方法 wag。接着展示了一个不能被 Monkey Patching 的内置类型 int,以及一个继承自 int 的自定义类 MyInt,展示了后者可以进行 Monkey Patching。最后通过几个测试用例来验证 Monkey Patching 的效果。其中包括:
- 测试原本定义的 Dog 类是否能够正常运作。
- 测试 Monkey Patching 后 Dog 类是否能够正常运作。
- 测试不能被 Monkey Patching 的内置类型 int。
- 测试继承自内置类型 int 的自定义类 MyInt 是否可以进行 Monkey Patching,并验证 Monkey Patching 的效果。
阅读全文