zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
    linux 查看服务器cpu 与内存配置
    arthas 使用总结
    selinux contexts 安全上下文的临时更改
    Android 8.1 Doze模式分析(五) Doze白名单及Debug方式
    Window 任意窗口置顶软件Window TopMost Control
    Android ApkToolPlus一个可视化的跨平台 apk 分析工具
    SVN Please execute the 'Cleanup' command.
    Android 如何在64位安卓系统中使用32位SO库
    Android cmd命令查看apk是32位还是64位?
  • 原文地址:https://www.cnblogs.com/gouguoqilinux/p/9197148.html
Copyright © 2011-2022 走看看