Class 的继承分类

单继承链/无重叠的继承链/有重叠的继承链

class 的继承算法

深度优先算法:

1. 把根节点压入栈中

2.每次从栈中弹出一个元素,搜索所有在它下一级的元素,将这些元素压入栈中,

3 重复1和2

C3算法:公式:

L(object)=[object]

L(子类(父类1,.父类2))=[子类]+ merge(L(父类1,.父类2),[父类1,父类2])

merge算法

1 第一个列表的第一个元素是后续列表的第一个元素,或者后续列表中没有再次出现,则将这个元素合并到最终的解析列表中,并从当前操作的所有列表中删除

2. 如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则

3. 如果最终无法把所有元素归并到解析列表,则报错

C3算法例子:

import inspect

class D:

pass

# L(D(object))= [D] + merge(L(object),[object])

# = [D] +merge(L[object],[object])

# = [D,object] + merge(L[], [])

# = [D, object]

class B(D):

pass

#L(B(object))= [B]+ merge(L(D),[D])

# = [B]+ merge([D, object],[D])

# = [B]+ merge([D, object],[D])

# = [B,D]+ merge(['', object],[''])

# = [B,D]+ merge([object])

# = [B,D,object]+ merge([])

# = [B,D,object]

class C(D):

pass

#L(C(object))= [C,D,object]

class A(B,C):

pass

#L(A)=[A]+merge(L(B),L(C),[B,C])

# =[A]+merge([B,D,object],[C,D,object],[B,C])

# =[A,B]+merge([D,object],[C,D,object],[C])

# =[A,B,C]+merge([D,object],[D,object])

# =[A,B,C,D]+merge([object],[object])

# =[A,B,C,D,object]

print(inspect.getmro(A))

结果:

(, , , , )

类的设计原则:

S: Single responsibility Principle 一个类只负责一项职责

O:       Open Closed Principle  ,对扩展开发,对修改关闭

L:   Liskov Substitution principle  里氏替换原则 使用基类引用的地方必须能使用继承类胡对象

I:         Interface Segregation Principle  如果一个类包含了过多的接口方法,面这些方法在使用过程中并非不可分割,那么应当将他们分离

D:       Dependency Inversion priciple  依赖倒置原则,高层模块不应该直接依赖底层模块,他们应该依赖抽象类或接口

1 classAnimal:2 def __init__(self,name,age=1):3 self.name=name4 self.age=age5

6 defeat(self):7 print("%s在吃饭"%self)8

9 defplay(self):10 print("%s在玩"%self)11

12 defsleep(self):13 print("%s在睡觉"%self)14

15 defeat(self):16 print("%s在吃饭"%self)17

18

19 classPerson(Animal):20 def __init__(self,name,pets,age=1):21 super().__init__(name,age)22 self.pets=pets23

24 defyang_pets(self):25 for pet inself.pets:26 print("%s在养宠物"%self)27 pet.eat()28 pet.play()29 pet.sleep()30

31 defmake_pets_work(self):32 for pet inself.pets:33 print("%s在安排工作" %self)34 pet.work()35

36 def __str__(self):37 return "小朋友{},年龄是{} 现在".format(self.name, self.age)38

39 classCat(Animal):40 defwork(self):41 print("%s在捉老鼠" %self)42

43 def __str__(self):44 return "宠物名字是{},年龄是{}".format(self.name,self.age)45

46

47 classDog(Animal):48 defwork(self):49 print("%s在看门" %self)50

51 def __str__(self):52 return "宠物名字是{},年龄是{}".format(self.name, self.age)53

54 d=Dog("小黑",18)55 c=Cat("小红",2)56 p=Person("LH",[d,c],18)57 p.yang_pets()58 p.make_pets_work()

结果如下:

小朋友LH,年龄是18 现在在养宠物

宠物名字是小黑,年龄是18在吃饭

宠物名字是小黑,年龄是18在玩

宠物名字是小黑,年龄是18在睡觉

小朋友LH,年龄是18 现在在养宠物

宠物名字是小红,年龄是2在吃饭

宠物名字是小红,年龄是2在玩

宠物名字是小红,年龄是2在睡觉

小朋友LH,年龄是18 现在在安排工作

宠物名字是小黑,年龄是18在看门

小朋友LH,年龄是18 现在在安排工作

宠物名字是小红,年龄是2在捉老鼠

python的原则_python 类的使用原则相关推荐

  1. python内容限制_Python --类,实例和访问限制

    与其他编程语言相比,Python的类机制添加了至少具有新语法和语义的类.它是C ++和Modula-3中发现的类机制的混合体. Python类提供面向对象编程的所有标准功能:类继承机制允许多个基类,派 ...

  2. python版本兼容性原则_Python中的EAFP原则是什么?

    达令说 我将尝试用另一个例子来解释它.在这里,我们试图访问文件并在控制台中打印内容.LBYL-在你跳之前看一看:我们可能需要检查是否可以访问该文件,如果可以,我们将打开它并打印内容.如果我们无法访问该 ...

  3. python反射实例化_Python类反射机制使用实例解析

    这篇文章主要介绍了Python类反射机制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 反射就是通过字符串的形式,导入模块:通过字符串的 ...

  4. python类变量继承_python 类的成员及继承

    1. @staticmethod 静态方法 静态方法不能访问实例变量和类变量,除了身处类里面,所以只能通过类调用以外,它其实和类没有什么关系.如果想要用它访问实例变量或类变量,需要把实例和类传递给函数 ...

  5. python继承问题_Python类的继承问题

    Python相比较Java,C++之类的高级语言是相对来说比较容易的,但能把Python学的很好的人却不多.虽然Python容易,但python的学习道路并不简单,可借助的资料不多,能把python讲 ...

  6. python类方法继承_python类的继承

    一.概述 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承 ...

  7. python accessiblechildren用法_python类继承用法实例分析

    本文实例讲述了python类继承用法.分享给大家供大家参考.具体如下: help('object') # test class Class1(object): """ C ...

  8. python的类方法_python 类不实例化,调用类方法:@staticmethod 和 @classmethod

    @staticmethod 和 @classmethod 用法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要 ...

  9. python自增_python – 类实例的自动递增ID

    免责声明:这是我目前正在进行的一个学期项目.我的问题是关于实施级别的细节,而不是评分方案的一部分.我只是编写这段代码,以此来测试我将为我将要撰写的论文提出的理论. 此外,我已经考虑了this ques ...

最新文章

  1. 星空主题设计理念_南京婚礼丨一起去看不同经纬度城市的星空吧
  2. CHECKLIST TO USE BEFORE SUBMITTING A PAPER TO A JOURNAL
  3. javaweb家居用品线上销售系统_智能家居订单管理系统方案设计路线
  4. Linux系统管理——系统启动和内核管理
  5. [Linux] Linux常用网站
  6. python监控网页变化教程_Python实时监控网站浏览记录实现过程详解
  7. c语言12个实验报告,C语言实验报告合集
  8. 谷歌浏览器导入插件教程
  9. Highcharts-制作图表的js库
  10. [转] Redefining the shading languages ecosystem with SPIR-V
  11. 程序和进程和线程的区别是什么?
  12. Galera Cluster For MySQL
  13. Unity3D学习记录——NGUI Sprit
  14. 澳大利亚史上最大数据泄露事件,40%的居民信息被泄露
  15. 获取krpano点坐标 ath-x  atv-y
  16. mysql qc_MySQL数据库编程中QC的使用方法
  17. R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、从雅虎金融读取著名港股长江实业的股票数据
  18. Python虚拟环境(二):Linux基于Anaconda创建虚拟环境并打包
  19. mysql驱动maven_IDEA用Maven连接MySQL的jdbc驱动,并操作数据库
  20. HEAD: HEtero-Assists Distillation for Heterogeneous Object Detectors

热门文章

  1. python居中对齐代码end_Python tkinter.END属性代码示例
  2. 树和而叉查找树的实现
  3. windows消息处理机制
  4. java 中的2个接口 Comparable和Comparator
  5. Xcode 6 allows VECTOR image assets… any idea how to use them?
  6. 通过日志恢复MS SQL数据案例
  7. StringBuilder与String互转
  8. 显示Intent和隐式Intent
  9. [HDOJ3998] Sequence(DP,最大流)
  10. 什么情况下会用到try-catch