6 Jun 18 复习,面向对象

6 Jun 18 复习,面向对象

一、复习

  1. 在现实世界中,先有对象,再有类;在程序中,先定义类,后产生对象
  2. 类有两种属性:数据属性和函数属性
  3. 类的数据属性是所有对象共享的;类的函数属性是绑定给对象用的
  4. 通过继承建立的派生类与基类间是一种是的关系,通过组合是一种有的关系
  5. 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
  6. 子类中调用父类的方法:父类名.父类方法(); super(); 二者使用哪一种都可以,但最好不要混合使用 
  7. 封装的真谛在于明确地区分内外
  8. 封装数据:将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。
  9. 封装方法:目的是隔离复杂度
  10. 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)

  1. 反射

hasattr(object,name)

getattr(object, name, default=None)

setattr(x, y, v) 

delattr(x, y)

  1. 反射的好处:事件可插拔机制等

#from module import FtpClient

f1=FtpClient('192.168.1.1')

if hasattr(f1,'get'):

    func_get=getattr(f1,'get')

    func_get()

else:

    print('---->不存在此方法')

print('处理其他的逻辑')

  1. __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. 面向对象三大特性:封装、继承、多态

猜你喜欢

转载自www.cnblogs.com/zhangyaqian/p/py201806060.html