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. LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  2. Mac下webpack安装

    最近开始接触构建工具webpack,公司电脑是 windows,而我自己的呢是mac.本来以为在自己电脑安装很简单,但是出了点问题,所以写出来分享下. 这里用npm的方式安装,首先你要安装node.j ...

  3. gethostbyname()函数

    gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件    #include <netdb.h>    #include <sys/socket.h> ...

  4. 《Drools7.0.0.Final规则引擎教程》之Springboot集成

    本来准备按部就班的一章一章更新Drools相关教程,怎奈QQ群组(593177274)有朋友急需Springboot与Drools的集成demo,于是抽出时间写了一个,现在拿出来分享一下.加入群组可免 ...

  5. ng $http 和远程服务器通信的一个服务。

    $http({url:'',method:''}).success().error() 简洁写法:$http.get()$http.post()... 注意事项:①要求返回的数据格式是json格式②在 ...

  6. 哈工大同义词词林 python 使用范例

    哈工大的同义词词林,应该是上个世纪的产物,里面的词比较老旧,但好歹也能用 同义词词林的作用,跟word2vec的获取相近词函数比较类似,这两者发挥的功效比较,看具体的应用吧 1. 首先下载包含同义词的 ...

  7. php之opcodes

    opcode是一种php脚本编译之后的语言. 例如: <?php echo "Hello World"; $a = 1 + 1; echo $a; ?> php执行这段 ...

  8. Java中数据库连接池原理机制的详细讲解(转)

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池 (Resource Pool).该模 ...

  9. vs中删除nuget包

    最近发现有些解决方案都是用来nuget包,这个偶尔能跑,但是有一个爱抽风的毛病,生成解决方案的时候报错:无法连接到远程服务器,真几把蛋疼.... 就是下图的情况 网上找了下不是很容易找到处理这个问题的 ...

  10. pmm监控页面502

    我们知道pmm主要使用的是 普罗米修斯采集和grafana日志统计显示. 最近为硬盘扩过一次容量,主要是docker使用的,我的pmm是跑在docker上的,但是重启后pmm的debug日志下载502 ...