6 Jun 18 复习,面向对象
一、复习
- 在现实世界中,先有对象,再有类;在程序中,先定义类,后产生对象
- 类有两种属性:数据属性和函数属性
- 类的数据属性是所有对象共享的;类的函数属性是绑定给对象用的
- 通过继承建立的派生类与基类间是一种是的关系,通过组合是一种有的关系
- 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
- 子类中调用父类的方法:父类名.父类方法(); super(); 二者使用哪一种都可以,但最好不要混合使用
- 封装的真谛在于明确地区分内外
- 封装数据:将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。
- 封装方法:目的是隔离复杂度
- Property
class People:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property
def bmi(self):
return self.weight/(self.height**2)
p1=People('egon',75,1.85)
print(p1.bmi)
- 反射
hasattr(object,name)
getattr(object, name, default=None)
setattr(x, y, v)
delattr(x, y)
- 反射的好处:事件可插拔机制等
#from module import FtpClient
f1=FtpClient('192.168.1.1')
if hasattr(f1,'get'):
func_get=getattr(f1,'get')
func_get()
else:
print('---->不存在此方法')
print('处理其他的逻辑')
- __setattr__添加/修改属性时会触发
__delattr__删除属性时会触发
__getattr__只有在使用点调用属性且属性不存在的时候才会触发
__getattribute__在使用点调用属性时,不管属性是否存在都执行
当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,除非__getattribute__在执行过程中抛出异常AttributeError
二、面试题
1. 谈谈你对面向对象的理解?
扩展方便;上帝视角,造一些对象(对象是特征与技能的结合体),让他们之间发生反应
2. Python面向对象中的继承有什么特点?
方便代码重用,可以多继承
3. 面向对象深度优先和广度优先是什么?
菱形继承的背景下,查找属性时:
1、经典类:深度优先
在python2中,A为经典类,F->D->B->A->E->C
2、新式类:广度优先
在python3中,A为新式类,F->D->B->E->C-A->object
4. 面向对象中super的作用?
A内super会基于C.mro()继续往后找;子代继承父代的方法
5. 列举面向对象中特殊成员(带双下划线的特殊方法,如:__new__、__init__、__call__等)
__new__ # 创建对象
__init__ # 初始化对象
__call__ # 调用对象
__str__ # print打印一个对象时 __unicode__(python2中)
__repr__ # 输入对象回车找的是__repr__; print先找__str__,没有__str__找__repr__
__doc__ # 查看文档注释
__getattr__
__setattr__
__del__ # 删除对象
6. 静态方法和类方法区别?
@staticmethod 不主动传值,只是一个单纯的函数
@classmethod 类调用时,将类本身作为第一个参数传入
7. 面向对象三大特性:封装、继承、多态