python 类的继承
一、父类、子类
继承如何表示:
class 子类名(父类名):
pass
1)子类通过继承可以获得父类的属性和方法
class Phone: def __init__(self, number): self.number = number def call(self, toWho, record=False): # 默认不录音 """打电话""" print('本机号:{}正在给{}打电话'.format(self.number, toWho)) if record: self.record() def record(self): print('打电话的时候,正在录音') #智能手机 class smartPhone(Phone):#子类smartPhone继承父类Phone的方法和属性 pass class IPhone(): pass #初始化一个普通手机 normal_phone = Phone('16654546765') print(normal_phone.call('LiLi')) print(normal_phone.number) #初始化一个智能手机huawei huawei = smartPhone('18678787878')#smartPhone继承了父类Phone的__init__,这里需要传入number的参数 print(huawei.call('zjx')) print(huawei.number)
''' 本机号:16654546765正在给LiLi打电话
None
15866668888
本机号:18678787878正在给zjx打电话
None
13988886666
'''
2)父类不能调用子类方法,单边的
class Phone: def __init__(self, number): self.number = number def call(self, toWho, record=False): # 默认不录音 """打电话""" print('本机号:{}正在给{}打电话'.format(self.number, toWho)) if record: self.record() def record(self): print('打电话的时候,正在录音') #智能手机 class smartPhone(Phone): def watch_moive(self,name): print('正在看{}电影') class IPhone(): pass #父类不能调用子类的方法 normal_Phone = Phone('18821213434') print(normal_Phone.watch_moive('八佰')) ''' AttributeError: 'Phone' object has no attribute 'watch_moive' '''
3)子类可以实现自己独有的方法,子类可以覆盖父类方法==>重写
class Phone: def __init__(self, number): self.number = number def call(self, toWho, record=False): # 默认不录音 """打电话""" print('本机号:{}正在给{}打电话'.format(self.number, toWho)) if record: self.record() def record(self): print('打电话的时候,正在录音') #智能手机 class smartPhone(Phone): def __init__(self,name,brand): self.name = name self.brand = brand def watch_moive(self,moive_name): print('用{}手机正在看电影:{}'.format(self.name,moive_name)) class IPhone(): pass #实例化一个智能手机对象oppo oppo = smartPhone('oppo','30')#这里传入的参数必须是2个,子类重写父类的方法,子类调用必须用自己的 print(oppo.name) print(oppo.brand) print(oppo.watch_moive('《流浪地球》')) ''' oppo 30 用oppo手机正在看电影:《流浪地球》 None '''
4)当子类和父类具有相同的方法或者属性的时候,父类还是用自己的,子类不在用父类的而是用自己的
5)两层继承,子类没有的方法,可以去父类的父类找
class Phone: def __init__(self, number): self.number = number def call(self, toWho, record=False): # 默认不录音 """打电话""" print('本机号:{}正在给{}打电话'.format(self.number, toWho)) if record: self.record() def record(self): print('打电话的时候,正在录音') #智能手机 class SmartPhone(Phone): def __init__(self,name,brand): self.name = name self.brand = brand def watch_moive(self,moive_name): print('用{}手机正在看电影:{}'.format(self.name,moive_name)) class IPhone(SmartPhone): def __init__(self,number): self.number = number self.brand = '苹果8' def face_time(self): '''直播''' print('{}正在直播'.format(self.number)) def call(self, toWho, record = False,face = False): '''打电话既可以录音 也可以facetime''' print('{}正在给{}打电话'.format(self.number,toWho)) if record: self.record() #IPhone这个类里面没有record()方法,就往父类找,父类没有,就往父类的父类去找 if face: self.face_time() #实例化一个对象iPhone iPhone = IPhone('19977776666') print(iPhone.call('Lucy',True)) ''' 19977776666正在给Lucy打电话 打电话的时候,正在录音 None '''
二、super( ) 超继承
使用父类当中的方法
注意:super()函数只能是调用父类的方法 (不能越级调用父类的父类)
class YiFu: def sell(self): print('商场正在卖衣服') class GirlYiFu(YiFu): def sell(self): # YiFu().sell() 如果父类方法需要传参数,就不方便了,要使用super super().sell() print('女装独特的卖衣服技巧') normal = YiFu() normal.sell() nvzhuang = GirlYiFu() nvzhuang.sell() ''' 商场正在卖衣服 商场正在卖衣服 女装独特的卖衣服技巧 '''
class Phone: def call(self,towho): pass class SmartPhone(Phone): def call(self,towho,face = False): pass class IPhone(SmartPhone): def call(self, towho, face=False): super().call(towho) #只能调用父类的,不能越级调用 print('正在给{}打电话'.format(towho)) #实例化一个对象 iPhone = IPhone() print(iPhone.call('tudou',True))
总结:
1.super():子类使用super()函数,继承父类的方法,如果父类的方法里是传参数的,子类的方法也要正常传参数
2.super()函数可以简化代码,不用也是可以的。
3.继承父类,父类的方法就可以用。如果子类定义了(重写),就可以不用父类的方法
三、多重继承
一个子类可以同时继承多个父类,这多个父类的方法和属性,都可以访问
class SmartPhone: pass class Camera: pass class Recorder: pass #Iphone这个子类同时继承上面3个父类 class Iphone(SmartPhone,Camera,Recorder): pass
扩展:属性的动态设置
1)对象.属性去获取属性
class Iphone: def __init__(self,number): self.number = number #实例化一个对象iphone iphone = Iphone('18831114545') print(iphone.number) #18831114545
2)getattr()的内置函数: 用于动态返回一个对象属性值
class Iphone: def __init__(self,number): self.number = number #实例化一个对象iphone iphone = Iphone('18831114545') print(iphone.number) #18831114545 #动态获取该对象的属性 print(getattr(iphone,'number')) #18831114545,这里的number是字符串
3) getattr()动态设置不存在的属性
class Iphone: def __init__(self,number): self.number = number # 实例化一个对象iphone iphone = Iphone('18831114545') print(iphone.number) #18831114545 # 动态获取该对象的属性 print(getattr(iphone,'number')) #18831114545,这里的number是字符串 # 动态设置不存在的属性 print(getattr(iphone,'brand','苹果')) # 苹果 print(iphone.brand) # 会报错。AttributeError: 'Iphone' object has no attribute 'brand'
4)动态属性赋值给变量 可以将属性定义为变量传入
class Iphone: def __init__(self,number): self.number = number # 实例化一个对象iphone iphone = Iphone('18831114545') print(iphone.number) #18831114545 # 动态获取该对象的属性 print(getattr(iphone,'number')) #18831114545,这里的number是字符串 # 属性赋值给变量,通过变量获取属性 prop_name = 'brand' print(getattr(iphone,prop_name,'苹果')) # 苹果
5)setattr():设置属性
class Iphone: def __init__(self,number): self.number = number #实例化一个对象iphone iphone = Iphone('18831114545') print(iphone.number) #18831114545 #动态设置属性 setattr(iphone,'number','16631102424') #等价于iphone.numbe = '999',但是这个方法是不能用变量的 print(iphone.number) #16631102424 #设置不存在的属性 setattr(iphone,'color','white') #访问设置的属性 print(iphone.color) #white
getattr():动态获取属性(已经存在的);动态设置不存在的属性,返回默认值
setattr():动态设置不存在的属性,设置完该属性,该属性就会存在,可以进行访问