• python的类的继承-接口继承-归一化设计


    1、先在子类本身找,如果子类没有,会去父类找

    class Dad:
        '这个是爸爸类'
        money=10#Dad类的数据属性
        def __init__(self,name):
            print("爸爸")
            self.name=name
        def hit_son(self):
            print("%s 正在打儿子" %self.name)
    class Son(Dad):
        pass
    print(Son.money)#继承父类的数据属性
    s1=Son("gouguoqi")#实例化的时候因为本身没有,所以会触发父类的init
    # Son.hit_son()
    # print(Dad.__dict__)#打印父类的属性字典
    # print(Son.__dict__)
    
    C:python35python3.exe D:/pyproject/day25/继承.py
    
    10
    
    爸爸

    2、如果子类中的属性和父类的属性重名的话,不会覆盖父类的,而是调用哪个就是哪个值

    class Dad:
        '这个是爸爸类'
        money=10#Dad类的数据属性
        def __init__(self,name):
            print("爸爸")
            self.name=name
        def hit_son(self):
            print("%s 正在打儿子" %self.name)
    class Son(Dad):
        money = 20
        pass
    print(Son.money)#子类有和这个数据属性
    s1=Son("gouguoqi")#实例化的时候就先从本身找到了
    print(s1.name)
    print(s1.money)#打印实例的数据属性,自己没有就去父类找
    print(Dad.money)#打印父类的数据属性
    print(s1.__dict__)#查看实例的属性字典
    s1.hit_son()#调用父类的函数属性
    
    C:python35python3.exe D:/pyproject/day25/继承.py
    
    20
    
    爸爸
    
    gouguoqi
    
    20
    
    10
    
    {'name': 'gouguoqi'}
    
    gouguoqi 正在打儿子

    3、给儿子类也增加一个init函数属性和hit_son的函数属性,然后在实例化的时候就先在儿子类本身找了,找到就执行了

    class Dad:
        '这个是爸爸类'
        money=10#Dad类的数据属性
        def __init__(self,name):
            print("爸爸")
            self.name=name
        def hit_son(self):
            print("%s 正在打儿子" %self.name)
    class Son(Dad):
        money = 100000099
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def hit_son(self):
            print("来自儿子类的hitson")
    s1=Son("gouguoqi",28)#实例化的时候因为本身没有,所以会触发父类的init
    s1.hit_son()
    
    C:python35python3.exe D:/pyproject/day25/继承.py
    
    来自儿子类的hitson

    4、我们来看这个例子,很明显这吃喝拉撒都属于2个类的共同的地方,所以我们可以把这个做成一个父类,然后让子类都继承一下就可以了

    class Cat():#定义一个猫的类,猫有叫吃喝拉撒的5个函数属性
        def miaomiaojiao(self):
            print("喵喵叫")
        def chi(self):
            pass
        def he(self):
            pass
        def la(self):
            pass
        def sa(self):
            pass
    class Dog():#定义一个狗的类,狗有叫吃喝拉撒的5个函数属性
        def wangwangjiao(self):
            print("汪汪叫")
        def chi(self):
            pass
        def he(self):
            pass
        def la(self):
            pass
        def sa(self):
            pass

    改进之后

    class Animal():
        def chi(self):
            pass
        def he(self):
            pass
        def la(self):
            print("正在拉屎")
        def sa(self):
            pass
    class Cat(Animal):#继承父类Animal
        def miaomiaojiao(self):
            print("喵喵叫")
    class Dog(Animal):#继承父类Animal
        def wangwangjiao(self):
            print("汪汪叫")
    print(Cat.__dict__)
    Cat.la(11)
    
    C:python35python3.exe D:/pyproject/day25/继承.py
    
    {'__module__': '__main__', 'miaomiaojiao': <function Cat.miaomiaojiao at 0x0000000000702400>, '__doc__': None}
    
    正在拉屎

    上面这个吃喝拉撒就是继承的父类的,miaomiaojiao和wangwangjiao就是派生,

    上面这种情况尽量别用,因为从程序角度来看,子类和父类已经耦合到一起了。。。不利于后期的扩展和改动了

    5、接口继承

    接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的

    基类里面的方法不用具体的实现,只是一个规范而已

    5.1实现一个一切皆文件的概念

    class Disk:
        def read(self):
            pass
        def write(self):
            pass
    class Cdrom:
        def read(self):
            pass
        def write(self):
            pass
    class Mem:
        def read(self):
            pass
        def write(self):
            pass

    5.2可以定义一个基类,对上面代码进行改进

    class Allfile:
        def read(self):
            pass
        def write(self):
            pass
    class Disk(Allfile):
        def read(self):
            print("disk read")
        def write(self):
            print("disk write")
    class Cdrom(Allfile):
        def read(self):
            print("cdrom read")
        def write(self):
            print("cdrom write")
    class Mem(Allfile):
        def read(self):
            print("mem read")
        def write(self):
            print("mem write")

    5.3但是子类也可以不按照你规定的出牌,Mem就是不听话,他不定义write的函数属性,然后就会从父类找。父类里面又是pass

    class Allfile:
        def read(self):
            pass
        def write(self):
            pass
    class Disk(Allfile):
        def read(self):
            print("disk read")
        def write(self):
            print("disk write")
    class Cdrom(Allfile):
        def read(self):
            print("cdrom read")
        def write(self):
            print("cdrom write")
    class Mem(Allfile):
        def read(self):
            print("mem read")
    m1=Mem()
    m1.read()
    m1.write()
    
    C:python35python3.exe D:/pyproject/day25/接口继承.py
    
    mem read

    5.4所以python就有一个专门的模块来实现这个强制性的约束子类,模块叫abc

    导入模块abc,给父类2个属性加上装饰器之后,如果子类再少属性的话,就直接报错了,这样就强制性的约束了子类必须有父类的2个方法了

    import abc
    class Allfile(metaclass=abc.ABCMeta):
        @abc.abstractstaticmethod
        def read(self):
            pass
        @abc.abstractstaticmethod
        def write(self):
            pass
    class Disk(Allfile):
        def read(self):
            print("disk read")
        def write(self):
            print("disk write")
    class Cdrom(Allfile):
        def read(self):
            print("cdrom read")
        def write(self):
            print("cdrom write")
    class Mem(Allfile):
        def read(self):
            print("mem read")
    m1=Mem()
    
    TypeError: Can't instantiate abstract class Mem with abstract methods write

    5.5当子类Mem也加上write这个方法之后就可以正常运行了

    import abc
    class Allfile(metaclass=abc.ABCMeta):
        @abc.abstractstaticmethod
        def read(self):
            pass
        @abc.abstractstaticmethod
        def write(self):
            pass
    class Disk(Allfile):
        def read(self):
            print("disk read")
        def write(self):
            print("disk write")
    class Cdrom(Allfile):
        def read(self):
            print("cdrom read")
        def write(self):
            print("cdrom write")
    class Mem(Allfile):
        def read(self):
            print("mem read")
        def write(self):
            print("mem write")
    m1=Mem()
    m1.read()
    m1.write()
    
    C:python35python3.exe D:/pyproject/day25/接口继承.py
    
    mem read
    
    mem write
  • 相关阅读:
    c# asp.net 鼠标改变控件坐标位置,更改控件坐标,注册表保存读取,打印,查找局域网内打印机等等收集
    jquery,extjs中的extend用法小结
    JavaScript创建Map对象(转)
    ExtJS与jQuery的一点细节上的对比
    jQuery 的原型关系图,整体把握jQuery
    github网站介绍、并使用git命令管理github(详细描述)
    1.移植3.4内核-分析内核启动过程,重新分区,烧写jffs2文件系统
    6.移植uboot-支持yaffs烧写,打补丁
    5.移植uboot-设置默认环境变量,裁剪,并分区
    4.移植uboot-使uboot支持DM9000网卡
  • 原文地址:https://www.cnblogs.com/gouguoqilinux/p/9197148.html
Copyright © 2020-2023  润新知