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

  1. class Dad:
  2. '这个是爸爸类'
  3. money=10#Dad类的数据属性
  4. def __init__(self,name):
  5. print("爸爸")
  6. self.name=name
  7. def hit_son(self):
  8. print("%s 正在打儿子" %self.name)
  9. class Son(Dad):
  10. pass
  11. print(Son.money)#继承父类的数据属性
  12. s1=Son("gouguoqi")#实例化的时候因为本身没有,所以会触发父类的init
  13. # Son.hit_son()
  14. # print(Dad.__dict__)#打印父类的属性字典
  15. # print(Son.__dict__)
  16.  
  17. C:\python35\python3.exe D:/pyproject/day25/继承.py
  18.  
  19. 10
  20.  
  21. 爸爸

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

  1. class Dad:
  2. '这个是爸爸类'
  3. money=10#Dad类的数据属性
  4. def __init__(self,name):
  5. print("爸爸")
  6. self.name=name
  7. def hit_son(self):
  8. print("%s 正在打儿子" %self.name)
  9. class Son(Dad):
  10. money = 20
  11. pass
  12. print(Son.money)#子类有和这个数据属性
  13. s1=Son("gouguoqi")#实例化的时候就先从本身找到了
  14. print(s1.name)
  15. print(s1.money)#打印实例的数据属性,自己没有就去父类找
  16. print(Dad.money)#打印父类的数据属性
  17. print(s1.__dict__)#查看实例的属性字典
  18. s1.hit_son()#调用父类的函数属性
  19.  
  20. C:\python35\python3.exe D:/pyproject/day25/继承.py
  21.  
  22. 20
  23.  
  24. 爸爸
  25.  
  26. gouguoqi
  27.  
  28. 20
  29.  
  30. 10
  31.  
  32. {'name': 'gouguoqi'}
  33.  
  34. gouguoqi 正在打儿子

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

  1. class Dad:
  2. '这个是爸爸类'
  3. money=10#Dad类的数据属性
  4. def __init__(self,name):
  5. print("爸爸")
  6. self.name=name
  7. def hit_son(self):
  8. print("%s 正在打儿子" %self.name)
  9. class Son(Dad):
  10. money = 100000099
  11. def __init__(self,name,age):
  12. self.name=name
  13. self.age=age
  14. def hit_son(self):
  15. print("来自儿子类的hitson")
  16. s1=Son("gouguoqi",28)#实例化的时候因为本身没有,所以会触发父类的init
  17. s1.hit_son()
  18.  
  19. C:\python35\python3.exe D:/pyproject/day25/继承.py
  20.  
  21. 来自儿子类的hitson

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

  1. class Cat():#定义一个猫的类,猫有叫吃喝拉撒的5个函数属性
  2. def miaomiaojiao(self):
  3. print("喵喵叫")
  4. def chi(self):
  5. pass
  6. def he(self):
  7. pass
  8. def la(self):
  9. pass
  10. def sa(self):
  11. pass
  12. class Dog():#定义一个狗的类,狗有叫吃喝拉撒的5个函数属性
  13. def wangwangjiao(self):
  14. print("汪汪叫")
  15. def chi(self):
  16. pass
  17. def he(self):
  18. pass
  19. def la(self):
  20. pass
  21. def sa(self):
  22. pass

改进之后

  1. class Animal():
  2. def chi(self):
  3. pass
  4. def he(self):
  5. pass
  6. def la(self):
  7. print("正在拉屎")
  8. def sa(self):
  9. pass
  10. class Cat(Animal):#继承父类Animal
  11. def miaomiaojiao(self):
  12. print("喵喵叫")
  13. class Dog(Animal):#继承父类Animal
  14. def wangwangjiao(self):
  15. print("汪汪叫")
  16. print(Cat.__dict__)
  17. Cat.la(11)
  18.  
  19. C:\python35\python3.exe D:/pyproject/day25/继承.py
  20.  
  21. {'__module__': '__main__', 'miaomiaojiao': <function Cat.miaomiaojiao at 0x0000000000702400>, '__doc__': None}
  22.  
  23. 正在拉屎

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

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

5、接口继承

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

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

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

  1. class Disk:
  2. def read(self):
  3. pass
  4. def write(self):
  5. pass
  6. class Cdrom:
  7. def read(self):
  8. pass
  9. def write(self):
  10. pass
  11. class Mem:
  12. def read(self):
  13. pass
  14. def write(self):
  15. pass

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

  1. class Allfile:
  2. def read(self):
  3. pass
  4. def write(self):
  5. pass
  6. class Disk(Allfile):
  7. def read(self):
  8. print("disk read")
  9. def write(self):
  10. print("disk write")
  11. class Cdrom(Allfile):
  12. def read(self):
  13. print("cdrom read")
  14. def write(self):
  15. print("cdrom write")
  16. class Mem(Allfile):
  17. def read(self):
  18. print("mem read")
  19. def write(self):
  20. print("mem write")

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

  1. class Allfile:
  2. def read(self):
  3. pass
  4. def write(self):
  5. pass
  6. class Disk(Allfile):
  7. def read(self):
  8. print("disk read")
  9. def write(self):
  10. print("disk write")
  11. class Cdrom(Allfile):
  12. def read(self):
  13. print("cdrom read")
  14. def write(self):
  15. print("cdrom write")
  16. class Mem(Allfile):
  17. def read(self):
  18. print("mem read")
  19. m1=Mem()
  20. m1.read()
  21. m1.write()
  22.  
  23. C:\python35\python3.exe D:/pyproject/day25/接口继承.py
  24.  
  25. mem read

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

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

  1. import abc
  2. class Allfile(metaclass=abc.ABCMeta):
  3. @abc.abstractstaticmethod
  4. def read(self):
  5. pass
  6. @abc.abstractstaticmethod
  7. def write(self):
  8. pass
  9. class Disk(Allfile):
  10. def read(self):
  11. print("disk read")
  12. def write(self):
  13. print("disk write")
  14. class Cdrom(Allfile):
  15. def read(self):
  16. print("cdrom read")
  17. def write(self):
  18. print("cdrom write")
  19. class Mem(Allfile):
  20. def read(self):
  21. print("mem read")
  22. m1=Mem()
  23.  
  24. TypeError: Can't instantiate abstract class Mem with abstract methods write

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

  1. import abc
  2. class Allfile(metaclass=abc.ABCMeta):
  3. @abc.abstractstaticmethod
  4. def read(self):
  5. pass
  6. @abc.abstractstaticmethod
  7. def write(self):
  8. pass
  9. class Disk(Allfile):
  10. def read(self):
  11. print("disk read")
  12. def write(self):
  13. print("disk write")
  14. class Cdrom(Allfile):
  15. def read(self):
  16. print("cdrom read")
  17. def write(self):
  18. print("cdrom write")
  19. class Mem(Allfile):
  20. def read(self):
  21. print("mem read")
  22. def write(self):
  23. print("mem write")
  24. m1=Mem()
  25. m1.read()
  26. m1.write()
  27.  
  28. C:\python35\python3.exe D:/pyproject/day25/接口继承.py
  29.  
  30. mem read
  31.  
  32. mem write

python的类的继承-接口继承-归一化设计的更多相关文章

  1. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  2. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  3. Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性

    一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由 ...

  4. python基础--接口与归一化设计、封装、异常、网络编程

    1 接口与归一化设计 1.1 归一化概念: 归一化的好处: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大降低了使用者的使用难度. 2.归一化使得高层的外部 ...

  5. Python 3 接口与归一化设计

    一.接口与归一化设计: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 2.归一化使得高层的外部使用者可以不加区分的处理所有接口兼 ...

  6. python:类的基本特征------继承、多态与封装

    一.继承 1,什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 cl ...

  7. python之接口与归一化设计

    1接口 接口的概念: Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface很好的体现了我们前面分析的接口的特征: * 1)是一组功能的集合, ...

  8. 实现继承+接口继承+虚方法+隐藏方法+this/base+抽象类+密封类/方法+修饰符

    概念: 在上一节课中学习了如何定义类,用类当做模板来声明我们的数据. 很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使 ...

  9. Day8 接口与归一化设计

    接口:在程序的使用中,我不能把程序的主体直接提供给使用者,一般是提供一个接口. 为什么要使用接口: 1,接口提取了一群共同的函数,可以把接口当做一个函数的集合. 2,让子类去实现接口中的函数. 归一化 ...

随机推荐

  1. Arcgis安装要素

    1. ArcGIS安装过程中需将用户名改为计算机名,该计算机名称时需要新建对话框. 2. ArcGIS Server安装过程中要设置ArcGISWebServices用户的读写权限,即设置ASP.NE ...

  2. 【ORACLE】oracle11g RAC搭建

    --安装好操作系统(rhel-server-6.7 on vmware) 注意事项: 1.磁盘配置lvm 2.账号密码 root/oracle ---------------------------- ...

  3. 轻量级直播服务器SRS安装及编译

    最近由于公司开发的需要--互动会议,开始研究直播中的技术.由于自身没有接触过虚拟机导致在研究的过程中遇到了很大的问题,首先官方GitHub给出的文档并没有清晰的指出编译是需要通过何种方式进行编译?以下 ...

  4. Asp.Net_HttpModule的应用

    IHttpModule向实现类提供模块初始化和处置事件. IHttpModule包含兩個方法: public void Init(HttpApplication context);public voi ...

  5. Jq_SetTimeOut

    倒计时 59 秒: var t function timedCount() { document.getElementById('txt').value=c ){ c--; }else{ clearT ...

  6. Html_兼容性

    那么如何禁止使用IE8兼容模式解析网页呢?在IE8以上版本的浏览器增加了一个X-UA-Compatible 头标记,用于为IE8指定不同的页面渲染模式. <meta http-equiv=&qu ...

  7. ELK安装部署

    一.ELK简介 ELK是Elasticsearch.Logstash.Kibana的简称,这三者是核心套件,但并非全部.Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大 ...

  8. OpenCV操作像素

    在了解了图像的基础知识和OpenCV的基础知识和操作以后,接下来我们要做的就对像素进行操作,我们知道了图像的本质就是一个矩阵,那么一个矩阵中存储了那么多的像素,我们如何来操作呢?下面通过几个例子来看看 ...

  9. 查看Python的版本、内建方法和模块等内容的方法

    若想更好地应用Python帮助我们解决日常生活的问题,就必须了解清楚它的内建方法和模块等特性.相信不少同学在安装某个版本的Python后,对于内建方法之类都是一知半解,希望本文能帮助了解Python的 ...

  10. PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了

    这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...