面向对象三大特性:封装、继承、多态
1、封装
将属性和方法写到类里面的操作就是封装的体现,在使用时用类去创建一个一个实例对象,对外只提供方法或属性的接口。
2、继承
在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
# ⽗父类A
class A(object):
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
# ⼦类B
class B(A):
pass
result = B()
result.info_print() # 1
继承分为单继承和多继承两种情况。
2.1、单继承
子类只有一个父类的继承形式成为单继承。
# 1. 师⽗父类
class Master(object):
def __init__(self):
self.kongfu = '[独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
# 2. 徒弟类
class Prentice(Master):
pass
# 3. 创建对象xiaowang
xiaowang= Prentice()
# 4. 对象访问实例属性
print(xiaowang.kongfu)
# 5. 对象调用实例⽅法
xiaowang.drive_car()
2.2、多继承
所谓多继承就是一个类同时继承了多个父类。
# 1. 师⽗父类
class Master(object):
def __init__(self):
self.kongfu = '[独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
#3、创办驾校
class School(object):
def __init__(self):
self.kongfu = '[秋名山驾校独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
# 4. 徒弟类
class Prentice(School,Master):
pass
# 5. 创建对象xiaowang
xiaowang= Prentice()
# 6. 对象访问实例属性
print(xiaowang.kongfu)
# 7. 对象调用实例⽅法
xiaowang.drive_car()
注意:当一个类有多个父类的时候,默认使用第⼀一个父类的同名属性和方法。
2.2.1子类重写父类同名方法和属性
class Master(object):
def __init__(self):
self.kongfu = '[独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
class School(object):
def __init__(self):
self.kongfu = '[秋名山驾校独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
# 独创技术
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[独创得意的飘开车绝技]'
def make_cake(self):
print(f'运⽤{self.kongfu}开车')
xiaowang=Prentice()
print(xiaowang.kongfu)
xiaowang.drive_car()
子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。
2.2.2子类调用父类同名方法和属性
class Master(object):
def __init__(self):
self.kongfu = '[独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
class School(object):
def __init__(self):
self.kongfu = '[秋名山驾校独门绝技]'
def drive_car(self):
print(f'运⽤{self.kongfu}开车')
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[独创得意的飘开车绝技]'
def drive_car(self):
# 如果是先调⽤了⽗类的属性和⽅法,⽗类属性会 覆盖⼦类属性,故在调⽤属性前,先调⽤⾃⼰子类的初始化
self.__init__()
print(f'运⽤{self.kongfu}开车')
# 调⽤父类⽅法,但是为保证调⽤到的也是⽗类的属性,必须在调⽤⽅法前调⽤⽗类的初始化
def master_drive_car(self):
Master.__init__(self)
Master.make_cake(self)
def school_drive_car(self):
School.__init__(self)
School.drive_cake(self)
xiaowang=Prentice()
print(xiaowang.drive_car)
print(xiaowang.master_drive_car)
print(xiaowang.school_drive_cake)
2.2.3 super()调用父类方法
使用super() 可以自动查找父类。调用顺序遵循 mro 类属性的顺序。比较适合单继承使用。
super().__init__()
super().drrive_car()
2.3 私有权限
在Python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。
设置私有权限的方法:在属性名和方法名 前面加上两个下划线 __。
私有属性和私有方法只能在类里面访问和修改。
在Python中,一般定义函数名get_xx 用来获取私有属性,定义set_xx 用来修改私有属性值。
3 多态
多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果。
实现步骤:
- 定义父类,并提供公共方法
- 定义子类,并重写父类方法
- 传递子类对象给调用者,可以看到不同子类执行效果不同。
class Dog(object):
def work(self): # ⽗父类提供统一的方法,哪怕是空⽅法
print('指哪打哪...')
class ArmyDog(Dog): # 继承Dog类
def work(self): # ⼦类重写父类同名⽅法
print('追击敌人...')
class DrugDog(Dog):
def work(self):
print('追查毒品...')
class Person(object):
def work_with_dog(self, dog): # 传⼊不同的对象,执行不同的代码,即不同的work函数
dog.work()
ad = ArmyDog()
dd = DrugDog()
ff= Person()
ff.work_with_dog(ad)
ff.work_with_dog(dd)