封装 enclosure:
封装是指隐藏类的实现细节,让使用者不关心这些细节
封装的目的是让使用者通过尽可能少的方法(或属性)操作对象
私有属性和方法:
python类中,以双下划线('__')开头,不以双下划线结尾的标识符为私有成员,私有成员只能用该类的
方法来进行访问和修改
1)以__开头的属性为私有属性
2)以__开头的方法为私有方法
示例:
# 此示例示意用私有属性和方法来实现封装
class A:
def __init__(self):
self.__p1 = 100 # 私有属性
self.__p2__ = 200 # 非私有属性
self._p3 = 300
def show_info(self):
print(self.__p1) # 此对象的实例方法可以访问和修改私有属性
self.__m()
def __m(self):
print('...')
a = A()
a.show_info()
# print(a.__p1) # 不允许访问私有属性
print(a.__p2__)
# a.__m() # 不允许 访问私有方法
注:python的封装是假的封装(模拟的封装)
多态 polymorphic:
字面意思:'多种状态'
多态是指在继承/派生关系中,调用基类对象的类中,调用基类对象的方法,实际能调用子类的覆盖方法的现象
叫多态
状态:
静态(编译时状态)
动态(运行时状态)
说明:
多态调用的方法和对象相关,与类型无关
python全部对象都只有'运行时状态'
示例:
# poly.py
class Shape:
def draw(self):
print("Shape的draw()被调用")
class Point(Shape):
def draw(self):
print('正在画一个点')
class Circle(Point):
def draw(self):
print("正在画一个圈")
def my_draw(s):
s.draw() # <<<---此处显示出多态中的动态
s1 = Circle()
s2 = Point()
my_draw(s1)
my_draw(s2)
多继承 multiple inheritance:
多继承是指一个子类继承自两个或以上的基类
语法:
class 类名(基类名, 基类名2, 基类名3, ...):
语句块
说明:
一个子类同时继承多个基类,基类中的方法可以同时被继承下来,如果两个基类中有同名的方法,而在子类中又没有覆盖此方法时,调用结果难以确定
示例:
class A:
def m(self):
print("A.m被调用")
class B:
def m(self):
print("B.m()被调用")
class AB(A, B):
pass
ab = AB()
ab.m()
多继承的问题(缺陷):
标识符冲突问题(谨慎使用多继承)
多继承的MRO(Method Resolution Order)问题:
类的__mro__属性:
作用:
用来记录类的方法查找顺序
super()函数就是根据__mro__来调用上层方法