测试开发进阶(六)
面向对象编程的三大特征:封装,集成,多态
封装:将数据和方法放在一个类中
继承:python中的一个类可以继承于一个或多个类,被继承的叫父类(基类,base class),继承的类叫子类
多态:一类事物拥有多种形态,一个抽象类有多个子类,(多态的概念依赖于继承),不同的子类对象调用相同的方法,产生不同的执行结果,多态可以增加代码的灵活性
多态
1 | # -*- coding:utf-8 -*- |
鸭子类型的体现:
- 静态语言:上面传入的对象必须是Base类型或者它的子类,否则无法调用run()方法
- 动态语言:传入的不一定是Base类型,也可以是其他类型,只要内部实现了run()方法
多态的意义:开放封闭原则
- 对于一个变量,只需要知道它是Base类型,无需确切地知道它的子类型,就可以调用run()方法(调用方只管调用,不管细节)
- 当需要新增功能,只需要新增一个Base的子类实现run(),就可以在原来的基础上进行扩展,这就是著名的
开放封闭
原则 - 对扩展开放:允许新增Base子类
- 对修改封闭:不需要修改依赖Base类的run()等函数
数据和自省
类里面的属性:类属性
- 私有属性:以单下划线或者双下划线开头的属性
- 公有属性:普通的属性
1 | class MyClass(object): |
使用私有属性优化单例模式 更安全
1 | class MyClass(object): |
slots限制类拥有的属性
1 | class Hero(object): |
1 | class Hero(object): |
作用:不再生成__dict__
节约内存
自定义属性访问
内置函数:
- getattr() 获取对象属性
- setattr() 给对象设置属性
- delattr() 删除对象属性
1 | class Hero(object): |
__setattr__
方法
1 | class Hero(object): |
__delattr__
方法
1 | class Hero(object): |
__getattribute__
方法:查找属性,直接调用该方法进行查找
1 | class Hero(object): |
__getattr__
:如果属性不存在,getattribute报AttributeError错误,该方法会主动捕获异常
1 | class Hero(object): |