博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python的类的继承-接口继承-归一化设计
阅读量:5141 次
发布时间:2019-06-13

本文共 5108 字,大约阅读时间需要 17 分钟。

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):    passprint(Son.money)#继承父类的数据属性s1=Son("gouguoqi")#实例化的时候因为本身没有,所以会触发父类的init# Son.hit_son()# print(Dad.__dict__)#打印父类的属性字典# print(Son.__dict__)C:\python35\python3.exe D:/pyproject/day25/继承.py10爸爸

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    passprint(Son.money)#子类有和这个数据属性s1=Son("gouguoqi")#实例化的时候就先从本身找到了print(s1.name)print(s1.money)#打印实例的数据属性,自己没有就去父类找print(Dad.money)#打印父类的数据属性print(s1.__dict__)#查看实例的属性字典s1.hit_son()#调用父类的函数属性C:\python35\python3.exe D:/pyproject/day25/继承.py20爸爸gouguoqi2010{
'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)#实例化的时候因为本身没有,所以会触发父类的inits1.hit_son()C:\python35\python3.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):        passclass 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):        passclass Cat(Animal):#继承父类Animal    def miaomiaojiao(self):        print("喵喵叫")class Dog(Animal):#继承父类Animal    def wangwangjiao(self):        print("汪汪叫")print(Cat.__dict__)Cat.la(11)C:\python35\python3.exe D:/pyproject/day25/继承.py{
'__module__': '__main__', 'miaomiaojiao':
, '__doc__': None}正在拉屎

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

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

5、接口继承

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

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

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

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

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

class Allfile:    def read(self):        pass    def write(self):        passclass 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):        passclass 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:\python35\python3.exe D:/pyproject/day25/接口继承.pymem read

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

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

import abcclass Allfile(metaclass=abc.ABCMeta):    @abc.abstractstaticmethod    def read(self):        pass    @abc.abstractstaticmethod    def write(self):        passclass 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 abcclass Allfile(metaclass=abc.ABCMeta):    @abc.abstractstaticmethod    def read(self):        pass    @abc.abstractstaticmethod    def write(self):        passclass 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:\python35\python3.exe D:/pyproject/day25/接口继承.pymem readmem write

转载于:https://www.cnblogs.com/gouguoqilinux/p/9197148.html

你可能感兴趣的文章
判断字符串在字符串中
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
LinkedList<E>源码分析
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>