封装enclosure

  封装是指隐藏类的实现细节,让使用者不关心这些细节

  封装的目的是让使用者能过尽可能少的方法或属性操作对象

  python的封装是模拟的封装

私有属性和方法:

  python类中以双下划线'__' 开头,不以双下划线结尾的标识符为私有成员,私有成员只能使用方法进行访问和修改

  两种:

  私有属性

  私有方法--- 只能让该类的方法来调用

 

python封装为动态链接库用java使用_封装

多态 polymorphic:

  字面意思是"多种状态"

  多态是指在有继承/派生关系的类中,调用基类的对象的方法,实际能调用子类的覆盖方法的现象叫多态

  状态:

    静态(编译时状态)

    动态(运行时状态)

  说明:

    python全部对象都只有运行时状态,没有编译时状态

 

python封装为动态链接库用java使用_封装_02

多继承 multiple inheritance

  多继承是指一个子类继承自两个或两个以上的基类

  语法:

    class 类名(基类名1, 基类名2, ....):

      语句块

  说明:

    一个子类同时继承自多个父类,父类中的方法可以同时被继承下来

    如果两个父类中有同名的方法,而在子类中又没有覆盖此方法时,调用结果难以确定

 

python封装为动态链接库用java使用_迭代器_03

多继承的问题(缺陷)

  标识符冲突的问题

  要谨慎使用多继承

 

python封装为动态链接库用java使用_封装_04

多继承的问题MRO(method resolution order)问题

类的 __mro__属性

用来记录每个类的方法的查找顺序

用MRO来确定钻石继承的方法查找顺序

A

/ \

B C

\ /

D

 

python封装为动态链接库用java使用_封装_05

面向对象编程语言特征

  封装

  继承

  多态

面向对象的编程语言:

  C++, C#, Python, Java, objective-c, swift, ...

函数(方法)重写

  在自定义的类内添加相应的方法,让自定义的类创建的实例像内建对象一样进行内建函数操作

对象转字符串函数的重写(覆盖)

  repr(obj) 返回一个符合Python语法规则的字符串:

    通常:

      eval(repr(obj)) == obj

  str(obj) 通过给定的对象返回一个字符串(这个字符串通常是给人阅读的)

说明:

  1. str(obj) 函数先查找obj.__str__() 方法,调用此方法并返回结果

  2. 如果obj.__str__() 方法不存在,则调用obj.__repr__()方法并返回结果

  3. 如果obj.__repr__方法不存在,则调用object类的__repr__实例方法显示<__main__.XXX object at 0xAABBCCDD>格式的字符串

 

python封装为动态链接库用java使用_封装_06

重载方法:

  repr() 函数对应 def __repr__(self):

  str() ---------> def __str__(self):

内建函数的重写

  __abs__      abs(obj)

  __len__      len(obj)

  __reversed__   reversed(obj)

  __round__     round(obj)

 

python封装为动态链接库用java使用_取值_07

数据转换函数重写

  __complex__    complex(obj)

  __int__      int(obj)

  __float__     float(obj)

  __bool__     bool(obj)

 

python封装为动态链接库用java使用_封装_08

布尔测试函数重写

  作用:

    用于bool(obj) 函数取值

    用于if语句真值表达式取值

    用于while 语句真值表达式取值

  方法名: __bool__

  说明:

    当存在__bool__方法时,调用obj.__bool__() 取值

    当不存在__bool__方法时,调用obj.__len__() 取值

    当再不存在__len__方法时,直接返回True

 

python封装为动态链接库用java使用_取值_09

迭代器(高级)

  迭代器可以能过next(obj) 函数取值的对象,就是迭代器

  迭代器协议:

    迭代器协议是指对象能够使用next函数获取下一项数据,在没有下一项数据时触发一个StopIteration异常来终止迭代的约定

迭代器协议的实现方法:

__next__(self)

可迭代对象:

  是指能用iter(obj) 函数返回迭代器的对象

  可迭代对象的实现方法:

    __iter__(self)

 

python封装为动态链接库用java使用_迭代器_10