super():

  在单继承中就是单纯的寻找父类。

  在多继承中就是根据子节点所在图 的mro顺序,找寻下一个类。

遇到多继承和super():

  对象.方法

    1,找到这个对象对应的类。

    2,将这个类的所有父类都找到换成一个图。

    3,根据图写出广度优先的顺序。

    4,再看代码,根据广度优先,来找super().

# 在python 3x 中
class A:
def func(self):
print('A')
class B(A):
def func(self):
super().func()
print('B')
class C(A):
def func(self):
super().func()
print('C')
class D(B,C):
def func(self):
super().func()
print('D') d = D()
d.func()

钻石继承:深度优先。

   mro()    子类名.mro()

  经典类:在python2x版本才存在,且必须不继承object。python3x中默认继承object所以都是新式类。

  经典类:

    1,遍历的时候遵循深度优先算法。

    2,没有 mro() 方法。

    3,没有 super()方法。

  新式类:在python2x中需继承object才是新式类。

    1,遍历的时候遵循广度优先算法。

    2,有 mro() 方法。

    3,有super() 方法,但是在python2x中必须传参数(子类名.子类对象名)

# 在python2x中
# coding:utf-8 class A(object):
def func(self):
print('A')
class B(A):
pass
def func(self):
# super(B,self).func()
print('B')
class C(A):
pass
def func(self):
# super(C,self).func()
print('C')
class D(B,C):
pass
def func(self):
# super(D,self).func()
print('D')
d = D()
d.func()
print(D.mro()) # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]

继承与派生:

  子类会继承父类的所有方法,前提子类没有相同的方法名。

class Animal:
def __init__(self,name,hp,ad):
self.name = name
self.hp = hp
self.ad = ad
def eat(self):
print('eating in Animal')
self.hp += 20 class Person(Animal):
def __init__(self,name,hp,ad,sex): # 重写
super().__init__(name,hp,ad) # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self
self.sex = sex # 派生属性
self.money = 100
def attack(self,dog): # 派生方法
print('%s攻击了%s' % (self.name,dog.name))
def eat(self): # 重写
super().eat() # 在类内 使用super()方法着父类方法
print('eating in Person')
self.money -= 50 class Dog(Animal):
def __init__(self,name,hp,ad,kind):
super().__init__(name,hp,ad)
self.kind = kind # 派生属性
def bite(self,person): # 派生属性
person.hp -= self.ad alex = Person('alex',100,10,'female')
print(alex.__dict__) # 父类有eat 子类没有。
# alex.eat() # 找父类的。
# alex.eat() #子类有eat() 不管有没有都会先找子类的。
# 当子类中有,但是想要调用父类的方法。
# Animal.eat(alex) # 指名道姓
# super(Person,alex).eat() #super(子类名,子类对象名) 方法。

多继承:

  新式类,多继承,寻找名字的顺序,遵循广度优先。

class A:
def func(self):
print('A')
class B(A):
def func(self):
super().func()
print('B')
class C(A):
def func(self):
super().func()
print('C')
class D(B,C):
def func(self):
super().func()
print('D') d = D()
d.func()

python's twenty day for me 继承 和 super()方法的更多相关文章

  1. [python] 在 python2和3中关于类继承的 super方法简要说明

    下面举一个例子,同样的代码使用 python2 和 python3 写的,大家注意两段程序中红色加粗的部分: python2的类继承使用super方法: #-*- coding:utf-8 -*- ' ...

  2. python基础知识09-继承,多继承和魔术方法

    1.继承 class Father: def init(self,age,sex): self.age = age self.sex = sex class Son(Father): 类名后面写括号, ...

  3. sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO

    sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...

  4. Python面向对象篇(2)-继承

    在发表本篇随笔的时候,距离上一次发已经有一个多月了,很多朋友私信我为什么不持续更新了,在这里先跟大家说声抱歉.因为年底的工作较为繁重,实在分不出精力,更重要的也是在思考后面进阶的部分要按怎样的顺序写, ...

  5. python面向对象学习(四)继承

    目录 1. 单继承 1.1 继承的概念.语法和特点 1.2 方法的重写 1.3 父类的 私有属性 和 私有方法 2. 多继承 2.1 多继承的使用注意事项 2.2 新式类与旧式(经典)类 1. 单继承 ...

  6. python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)

    先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...

  7. 《Python》 面向对象三大特性之继承

    一.继承大纲: 继承和抽象(两个概念) 1.单继承: 语法: 父类.基类.超类 子类.派生类 继承与重用:子类可以使用父类中的名字(变量和方法) 继承与派生:子类在父类的基础上又新创建了自己需要的方法 ...

  8. Python 学习笔记(十五)Python类拓展(一)继承

    继承 继承(Inheritance):是面向对象软件技术当中的一个概念.如果一个类别A "继承自" 另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”,也可以称“B是A ...

  9. 【我要学python】面对对象编程之继承和多态

    class animal(object): def run(): print('animal is running...') class dog(animal): def run(self): pri ...

随机推荐

  1. 在阿里云上安装python3.4和pycharm

    一. 安装python3.4 二. 安装pycharm 三. 安装可视化界面和远程桌面连接 四. 启动和配置pycharm 五. 安装更多字体 六. 给pycharm设置桌面快捷方式 一. 安装pyt ...

  2. <mvc:default-servlet-handler/>的作用

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  3. 【Python】循环设计

    转载:作者:Vamei 出处:http://www.cnblogs.com/vamei range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标. ...

  4. 深入理解c/c++ 内存对齐

    内存对齐,memory alignment.为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐.原因在于,为了访问未对齐的内存,处理器需要作两次内存访问:然而,对齐的内存访问仅需要一 ...

  5. 自定义音频条形图--p52

    package com.zzw.qunyingzhuan2; import android.content.Context; import android.graphics.Canvas; impor ...

  6. Java8_00_资源帖

    一.官方资料 Java Platform Standard Edition 8 Documentation The Java™ Tutorials Java 8 API 二.精选资料 三.参考资料

  7. Struts04---命名空间的查询顺序以及默认执行的Action

    01.创建login.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  8. dateTimePicker编辑状态下,取值不正确的问题

    当对dateTimePicker进行编辑,回车,调用函数处理dateTimePicker的value值时,其取值结果是你编辑之前的值,而不是你编辑后的值,虽然dateTimePicker.text的值 ...

  9. http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化

    http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

  10. 【dlbook】深度网络

    前向网络:无反馈 feedback 连接 [输出单元] 线性 -- 高斯分布 . sigmoid单元 -- bernoulli输出. softmax单元 -- multinoulli [隐藏单元] 整 ...