菱形继承问题

经典类

  • 没有继承object类的就是经典类,只有Python2中有经典类
  • Python2当中不会默认继承object类,需要自己手动添加

新式类

  • 只要继承了object类的就是新式类,Python3当中所有的类都是新式类
  • 在Python3中会默认继承object类
class Foo:
pass print(Foo.__bases__)
(<class 'object'>,)

菱形继承

  • 当继承格局为菱形时,经典类和新式类搜索某一个属性的顺序会不一样
  • 经典类
    • 深度优先
  • 新式类
    • 广度优先
  • 经典类:一条路走到黑,深度优先

  • 新式类:不找那个最后继承的同一个类,直接去找下一个父类,广度优先

class G(object):
def test(self):
print('from G') class E(G):
def test(self):
print('from E') class B(E):
def test(self):
print('from B') class F(G):
def test(self):
print('from F') class C(F):
def test(self):
print('from C') class D(G):
def test(self):
print('from D') class A(B, C, D):
def test(self):
print('from A') a = A()
a.test()
from A -->B-->E-->C-->F-->D-->G--object

只是菱形继承,普通继承正常顺序找

大招

  • __mro__或者mro()
# for i in A.mro():
for i in A.__mro__:
print(i)
<class '__main__.A'>
<class '__main__.B'>
<class '__main__.E'>
<class '__main__.C'>
<class '__main__.F'>
<class '__main__.D'>
<class '__main__.G'>
<class 'object'>

多态与多态性

多态

  • 多种状态,只要大家能继承同一种东西A,这些东西就是A的多态

  • 一个类所延伸的多种形态,比如动物分为人类,狗类

import abc

class Animal(metaclass=abc.ABCMeta):		# 不推荐使用,这种方式会报错
def __init__(self, height, weight):
self.height = height
self.weight = weight @abc.abstractmethod # 类似于装饰器,强制要求子类必须有这个方法,没有就报错
def sleep(self):
print(self, '睡觉') @abc.abstractmethod # 只有符合我的条件,才能成为我的儿子
def eat(self):
print(self, '吃饭') class People(Animal):
def sleep(self):
print('我在睡觉') def eat(self):
print('我在吃饭') class Dog(Animal):
def sleep(self):
print('我也在睡觉') def eat(self):
print('我也在吃饭') d = Dog(100, 80)
d.sleep()
d.eat()
我也在睡觉
我也在吃饭
class Foo(Animal):		# 只要符合我的要求,就是我的儿子
def sleep(self):
print('我会睡觉') def eat(self):
print('我会吃饭')

多态性

  • 在继承的前提下,使用不同的子类,调用父类的同一个方法,产生不同的功能
class Animal:
def talk(self):
print('讲话') class Cat(Animal):
def talk(self):
print('miao~') class Dog(Animal):
def talk(self):
print('wang~') # Python(动态语言)
def func(obj): # 不关心obj是什么
obj.talk() c1 = cat()
func(c1) # 静态语言
def func(Cat, obj) # 如果这里声明Cat,那就不能用Dog
def func(dog, obj) # 同理,声明dog不能用cat
def func(Animal,obj) # 声明animal就都可以用

多态在Python中的体现

鸭子类型(重要)

  • 动态类型的一种风格

  • 只要一个对象会走,会游泳,会叫,那么它就可以当成是一个鸭子处理

    对于我们这个例子:你只要有sleep方法/有eat方法,无论你怎么定义这个类,你就是动物的一种形态,你这样才能用动物的方法,否则无法使用动物的方法

结论

  • 所以在Python当中,没有真正意义上的多态,也不需要多态

day35-2 类的三大特性---多态,以及菱形继承问题的更多相关文章

  1. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  2. (09)-Python3之--类的三大特性(封装、继承、多态)

    1.封装 封装,就是只能在类的内部访问,外部访问属性或方法会报异常,python中的封装很简单,只要在属性前或者方法名前加上两个下划线就可以,如self.__name,def __eat(self)这 ...

  3. python - class类 (六) 三大特性 - 多态

    多态的概念: # 多态的概念 # 指出了对象如何通过他们共同的属性和动作来操作及访问而不需考虑他们的具体的类 # 多态表明了动态绑定的存在,允许重载及运行时类型确定和验证. # 示例模拟: #水具有多 ...

  4. JAVA 类的三大特性,封装,继承,多态 的一些发现总结

    < 一 > 封装 < 二 > 继承 1,关于父类中的私有属性和方法,子类能不能访问的问题 1.1,子类不能通过继承拥有父类的私有属性和方法 1.2,子类可以从父类继承下来的 方 ...

  5. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  6. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  7. java提高篇之理解java的三大特性——多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  8. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  9. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

随机推荐

  1. 文件上传-jquery.uploadify.js

    <script type="text/javascript" src="../jquery_uploadify/jquery.uploadify-3.1.min.j ...

  2. SQLiteOpenHelper/SQLiteDatabase/Cursor源代码解析

    转载请注明出处:http://blog.csdn.net/y_zhiwen/article/details/51583188 Github地址.欢迎star和follow 新增android sqli ...

  3. 目标跟踪学习系列十:Struck:Structured Output Tracking with Kernels 代码调试

    本来想看完代码再具体的写的.可是有人问了就先贴出来吧! 代码调试中会遇到的一些的问题. 首先,你没有代码的话能够在这里下载:http://download.csdn.net/detail/u01219 ...

  4. update_notifier 造成nodejs进程数量增长的问题

    最近运维老大j哥找到我说了一个事儿:某私有化部署的线上环境nodejs进程数量多达1000+,对比公版线上环境的66个进程数显得十分诡异.并且单个nodejs进程所占用swap空间也较大,也不释放空间 ...

  5. WCF学习笔记——契约不能少了set

    我定义的WCF契约里,有一个类,里面的属性,有一个因为只读,所以只写了个get.结果客户端就报错. [DataContract] public class UserItem { public User ...

  6. luogu3155 [CQOI2009]叶子的染色

    题目大意 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  7. oc36--自定义构造方法在继承中的表现

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...

  8. 使用ALSA编写自己的音频程序【转】

    本文转载自:http://blog.csdn.net/beyondioi/article/details/6994548 Alsa是Linux高级音频接口.面对众多的音频设备,Alsa为Linux音频 ...

  9. git的使用(转)

    git 配置文件 git的配置文件位置针对所有用户:/etc/gitconfig针对当前用户: -/.gitconfig 查看配置的方法 git config --list 修改配置的方法 git c ...

  10. DCOM 找不到 office word 的解决方法

    1. 在运行里面  输入     comexp.msc -32  2.在“DCOM配置”中,为IIS账号配置操作Word(其他Office对象也一样)的权限. 具体操作:“组件服务(Component ...