zoukankan      html  css  js  c++  java
  • 十三、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():动态设置不存在的属性,设置完该属性,该属性就会存在,可以进行访问

  • 相关阅读:
    HANDLER进行堆叠注入
    CDUT第一届信安大挑战Re-wp
    Nu1LBook第一章wp
    Linux和VMWare
    [MRCTF]Xor
    IDA 调整栈帧 (411A04:positive sp value has been found)
    [BUU] 简单注册器
    2020年“安洵杯”四川省大学生信息安全技术大赛 部分WRITEUP
    关于我的pip不听话,总是说【Fatal error in launcher: Unable to create process using '"'】这件事
    C语言的PELode编写记录
  • 原文地址:https://www.cnblogs.com/zhangjx2457/p/13645632.html
Copyright © 2011-2022 走看看