测试开发进阶(五)
面向对象
魔术方法(魔法方法,特殊方法)
__new__
方法和单例模式
__init__
:在创建对象的时候,自动调用对 创建的对象 进行初始化设置的魔术方法:以双下划线开头,双下划线结尾的方法
1 | # known case of __new__ |
从源码可以看出,__new__
方法的作用是创建然后返回一个对象
1 | class Hero(object): |
单例模式
类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做?
普通模式:
1 | class Hero(object): |
单例模式:
第一次创建对象存起来,之后创建对象的时候直接返回第一次创建的对象
实现思路:
- 定义一个类属性,来记录该类是否创建过对象
- 在
__new__
方法中
1 | class MyClass(object): |
上下文管理器
上下文管理器:上下文管理器是一个python对象,为操作提供额外的上下文信息。这种额外的信息,使用with语句初始化上下文,以及完成with块中的所有代码时,采用可调用的形式
with关键字:启动对象的上下文管理器
object.__enter__(self)
输入与次对象相关的运行时上下文。如果存在的话,with语句将绑定该方法的返回值到该语句的as子语句中指定的目标
object.__exit__(self, exc_type, exc_val, exc_tb)
1 | with open('0814.py', 'r', encoding='utf8') as f: |
1 | class MyOpen(object): |
1 | class MyOpen(object): |
自己实现的文件操作上下文管理器
1 | class MyOpen(object): |
1 | exc_type # 异常类型 |
1 | class MyOpen(object): |
执行顺序:实例化(__init__
)—-> 执行__enter__
—->执行with中的代码—–>执行 __exit__
__str__
,__repr__
方法
1 | >> a = 'abc' |
当我们使用print()这个内置函数之后,给他传入一个对象,实际上是触发了它的
__str__
方法,将方法返回的内容输出到控制台
1 | class Hero(object): |
在交互环境中,输入对象,返回的是
__repr__
方法中所返回的内容
- 内置函数str转化一个对象时候,触发
__str__
方法 - 内置函数format处理对象时,触发
__str__
方法 - 内置函数repr函数,触发
__repr__
方法
1 | class Hero(object): |
__repr__
是__str__
的备胎,当没有__str__
的时候调用__repr__
,反过来不会
算数运算相关的魔术方法
__add__
:相加__sub__
:减法__mul__
:乘法__stuediv__
:除法__floordiv__
:整除__mod__
:取余
1 | class MyStr(): |
多个连续相加
1 | class MyStr(): |
一个没啥用的减法实现
1 | class MyStr(): |