函数的封装、多态、多继承

封装 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__来调用上层方法

猜你喜欢

转载自blog.csdn.net/weixin_43929852/article/details/85323605