#!/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 18:08:18 浏览: 51
这段代码是一个 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 的效果。
相关问题
#!/usr/bin/tcsh -f 与#!/usr/bin/tcsh的区别
#!/usr/bin/tcsh -f 与#!/usr/bin/tcsh的区别在于是否使用了"-f"参数。
#!/usr/bin/tcsh -f:使用了"-f"参数,表示在执行脚本时,不会读取用户的配置文件(例如~/.tcshrc),从而跳过配置文件中的设置,直接执行脚本中的命令。
#!/usr/bin/tcsh:没有使用"-f"参数,表示在执行脚本时,会读取用户的配置文件,并按照配置文件中的设置执行脚本中的命令。
使用"-f"参数可以确保脚本的执行与环境设置无关,对于一些需要独立环境的脚本来说,这样的设置可能更加可靠。然而,有些情况下,可能需要加载用户的配置文件来获取特定的环境变量或别名设置等。
所以,要根据具体的需求来决定是否使用"-f"参数。
#!/usr/bin/expect -f和#!/bin/bash
引用中给出了一个脚本的示例,其中#!/usr/bin/expect -f是脚本的第一行,用来指定使用expect作为脚本的解释器。这意味着这个脚本将使用expect的语法和功能来执行。而#!/bin/bash是另一种脚本的解释器,用于指定使用bash作为脚本的解释器。bash是一种常用的Unix shell程序,用于执行命令和脚本。
简而言之,#!/usr/bin/expect -f用于指定使用expect解释器来执行脚本,而#!/bin/bash用于指定使用bash解释器来执行脚本。两者都是根据脚本的需要来选择合适的解释器。<em>1</em><em>2</em><em>3</em>
#### 引用[.reference_title]
- *1* *2* *3* [shell阶段-day12-expect](https://blog.csdn.net/qq_23995091/article/details/113571554)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item]
[ .reference_list ]