目录
类的继承
子类通过继承父类,能够获取父类中定义的所有属性和方法(私有属性除外)。
注意:父类不能使用子类的属性和方法。
继承的作用:简化代码,提高代码的重用性。
示例:
未用到继承之前的代码:
class PhoneV1(object):
def call(self):
print('打电话的功能')
class PhoneV2(object):
def call(self):
print('打电话的功能')
def listen_music(self):
print('听音乐的功能')
def send_message(self):
print('发短信的功能')
class PhoneV3(object):
def call(self):
print('打电话的功能')
def listen_music(self):
print('听音乐的功能')
def send_message(self):
print('发短信的功能')
def we_chat(self):
print('聊微信的功能')
def plag_game(self):
print('玩游戏的功能')
用到继承之后的代码:
class PhoneV1(object):
def call(self):
print('打电话的功能')
class PhoneV2(PhoneV1):
def listen_music(self):
print('听音乐的功能')
def send_message(self):
print('发短信的功能')
class PhoneV3(PhoneV2):
def we_chat(self):
print('聊微信的功能')
def play_game(self):
print('玩游戏的功能')
# v1对应的类
print('------v1对应的类------')
v1 = PhoneV1()
v1.call()
# 父类不能调用子类的方法
# v1.listen_music() # 报错:AttributeError: 'PhoneV1' object has no attribute 'listen_music'
# v2对应的类
print('------v2对应的类------')
v2 = PhoneV2()
# 子类可以调用父类的方法
v2.call()
v2.listen_music()
v2.send_message()
# v3对应的类
print('------v3对应的类------')
v3 = PhoneV3()
v3.call()
v3.listen_music()
v3.send_message()
v3.we_chat()
v3.play_game()
多继承
子类可以继承多个父类,子类都可以用到继承的父类中的属性和方法。
示例:
class BaseA(object):
attr_a = 100
def func_a(self):
print('func_a----------aaa')
class BaseB(object):
attr_b = 900
def func_b(self):
print('func_b----------bbb')
class MyTest(BaseA, BaseB):
pass
m = MyTest()
print(m.attr_a)
print(m.attr_b)
m.func_a()
m.func_b()
注意:
如果子类继承的父类里面都有相同的方法,在调用的时候,会先找第一个父类的方法,找到了就不会继续找了,没找到就会继续找下一个父类的方法。
如果子类自己也有跟父类相同的方法,在调用的时候,子类会优先使用自己的方法,不会去找父类的方法了。
示例:
class BaseA(object):
attr_a = 100
def func_a(self):
print('func_a----------aaa')
def func(self):
print('func_ab----------ab')
class BaseB(object):
attr_b = 900
def func_b(self):
print('func_b----------bbb')
def func(self):
print('func_bb----------bb')
class MyTest(BaseA, BaseB):
pass
# def func(self):
# print('func_cb----------cb')
m = MyTest()
m.func()
重写父类方法
在子类中定义跟父类同名的方法就是重写父类方法。
示例:
class PhoneV1(object):
def call(self):
print('打电话的功能')
class PhoneV2(PhoneV1):
def listen_music(self):
print('听音乐的功能')
def send_message(self):
print('发短信的功能')
# 重写父类的方法
def call(self):
print('打视频电话的功能')
class PhoneV3(PhoneV2):
def we_chat(self):
print('聊微信的功能')
def play_game(self):
print('玩游戏的功能')
print('------v1对应的类------')
v1 = PhoneV1()
v1.call() # 输出结果:打电话的功能
print('------v2对应的类------')
v2 = PhoneV2()
# 子类可以调用父类的方法
v2.call() # 输出结果:打视频电话的功能
print('------v3对应的类------')
v3 = PhoneV3()
v3.call() # 输出结果:打视频电话的功能
调用被重写的父类方法
方式一:父类名.方法名(self)
方式二:super().方法名
示例:
class PhoneV1(object):
def call(self):
print('打电话的功能')
class PhoneV2(PhoneV1):
def we_chat(self):
print('聊微信的功能')
def play_game(self):
print('玩游戏的功能')
# 重写父类的方法
def call(self):
print('打视频电话的功能')
print('**********接下来想打语音电话')
# 调用父类里面的call()
# 方式一:父类名.方法名(self)
PhoneV1.call(self)
# 方式二:super().方法名
super().call()
v2 = PhoneV2()
v2.call()
super()的应用场景
主要是代码的扩展,扩展新功能。
示例:
class MyClass:
def __init__(self, a, b):
self.a = a
self.b = b
def number(self):
print('a+b=', self.a + self.b)
class MyClassV2(MyClass):
def number(self):
# 调用父类原有的方法
super().number()
# 在原有方法的基础上扩展新功能
print('a+b=', self.a / self.b)
m = MyClassV2(11, 22)
m.number()