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. 六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode("utf-8")将字节转化成字符串 ...

  2. SpringBoot_10_打成jar包后使用外部配置文件中的配置来启动工程

    一.前言 三.参考资料 1.Spring Boot配置文件放在jar外部

  3. windows server 2016 docker 之创建使用虚拟交换机

    windows server 2016 Create a virtual switch for Hyper-V virtual machines 操作步骤: 服务器只有一块网卡连接了网络 尝试1: h ...

  4. 剑指offer--35.数组中只出现一次的数字

    时间限制:1秒 空间限制:32768K 热度指数:198150 本题知识点: 数组 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. class ...

  5. Android 进阶12:进程通信之 Socket (顺便回顾 TCP UDP)

    不要害怕困难,这是你进步的机会! 读完本文你将了解: OSI 七层网络模型 TCPIP 四层模型 TCP 协议 TCP 的三次握手 TCP 的四次挥手 UDP 协议 Socket 简介 Socket ...

  6. [面试时]我是如何讲清楚TCP/IP是如何实现可靠传输的 转

    [面试时]我是如何讲清楚TCP/IP是如何实现可靠传输的 - shawjan的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/shawjan/article/det ...

  7. 如何用 Java 实现 Web 应用中的定时任务

    定时任务,是指定一个未来的时间范围执行一定任务的功能.在当前WEB应用中,多数应用都具备任务调度功能,针对不同的语音,不同的操作系统, 都有其自己的语法及解决方案,windows操作系统把它叫做任务计 ...

  8. libQt5Core.so: undefined reference to `dlclose@GLIBC_2.4'

    /******************************************************************************** * libQt5Core.so: u ...

  9. poj 3517

    题目链接  http://poj.org/problem?id=3517 题意        约瑟夫环  要求最后删掉的那个人是谁: 方法        理解递推公式就行了  考虑这样一组数据  k ...

  10. c#模拟键盘输入

    System.Windows.Forms.SendKeys.SendWait("j");