day35-2 类的三大特性---多态,以及菱形继承问题
菱形继承问题
经典类
- 没有继承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 类的三大特性---多态,以及菱形继承问题的更多相关文章
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- (09)-Python3之--类的三大特性(封装、继承、多态)
1.封装 封装,就是只能在类的内部访问,外部访问属性或方法会报异常,python中的封装很简单,只要在属性前或者方法名前加上两个下划线就可以,如self.__name,def __eat(self)这 ...
- python - class类 (六) 三大特性 - 多态
多态的概念: # 多态的概念 # 指出了对象如何通过他们共同的属性和动作来操作及访问而不需考虑他们的具体的类 # 多态表明了动态绑定的存在,允许重载及运行时类型确定和验证. # 示例模拟: #水具有多 ...
- JAVA 类的三大特性,封装,继承,多态 的一些发现总结
< 一 > 封装 < 二 > 继承 1,关于父类中的私有属性和方法,子类能不能访问的问题 1.1,子类不能通过继承拥有父类的私有属性和方法 1.2,子类可以从父类继承下来的 方 ...
- OC学习篇之---类的三大特性(封装,继承,多态)
之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...
- 转 OC温故:类的三大特性(封装,继承,多态)
原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...
- java提高篇之理解java的三大特性——多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- OC基础 类的三大特性
OC基础 类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...
随机推荐
- 装饰器 转载自 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- poj 1635
有根树同构.参考论文<hash在....> #include <iostream> #include <fstream> #include <algorith ...
- .Net程序猿玩转Android开发---(6)线性布局LinearLayout
LinearLayout控件是Android中重要的布局控件,是一个线性控件,所谓线性控件的意思是指该控件里面的内容仅仅能水平或垂直排列.也就 ...
- 极光推送案例-PushExample-Jpush
ssh - maven - java项目-极光注冊id完毕推送 这是我学习时的步骤: 1:去极光推送平台注冊账号,自己能够去注冊(一般公司会帮助完毕注冊) 地址:https://www.jpush.c ...
- mysql高可用架构方案之中的一个(keepalived+主主双活)
Mysql双主双活+keepalived实现高可用 文件夹 1.前言... 4 2.方案... 4 2.1.环境及软件... 4 2.2.IP规划... 4 2.3.架构图... ...
- HDU 3397 Sequence operation 多标记线段树
/* 一开始维护了两个标记 开了两个数组 想的是 可能当前两种操作都要做 但是太复杂了 不好处理 其实 当前要做的标记可以只有一个 我们在Insert的时候 要打的标记是2即翻转区间: 1.如果原来是 ...
- Android WiFi开发教程(二)——WiFi的搜索和连接
在上一篇中我们介绍了WiFi热点的创建和关闭,如果你还没阅读过,建议先阅读上一篇文章Android WiFi开发教程(一)——WiFi热点的创建与关闭. 本章节主要继续介绍WiFi的搜索和连接. Wi ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- ElasticSearch源码解析(五):排序(评分公式)
ElasticSearch源码解析(五):排序(评分公式) 转载自:http://blog.csdn.net/molong1208/article/details/50623948 一.目的 一个 ...
- heap堆&&priority_queue优先队列
堆(heap)不是stl中的东西...它分为 max heap 和min heap. 但我不想用这些,而是采用了priority_queue,优先队列,定义在queue中.顾名思义,它的作用就是无论怎 ...