通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,
如何在子类中调用父类的方法,
class Ainmal:
country='afdas'
def __init__(self,name,life_value,argg):
self.name=name
self.life_value=life_value
self.argg=argg
def eat(self):
self.life_value+=10
def equipment(self):
self.argg+=50
class Dog(Ainmal):
def __init__(self,name,breed,lief_value,argg):#使用父类的属性,指名道姓用法
self.breed=breed #派生属性,父类没有的属性
#Ainmal.__init__(self,name,lief_value,argg)#这里的参数位置一定要和类的位置一样
super().__init__(name,lief_value,argg) #新式类#这个方法和上边的方法一样,但是他是寻找最近的父类这个是
def eat(self):#
print('狗在吃屎') # 子类自己的方法
Ainmal.eat(self)#放在这里可以执行就也可以同时执行父类的放法
#super(Dog, self).eat()#与上一句的作用一样,也可以写成这种形式super().eat()
def get_weapon(self):#派生方法:子类中有但是父类中没有的方法
print('狗得到了武器,准备打人')
sonbyy=Dog('太白','哈士奇',1000,50)
print(sonbyy.eat)
print(Ainmal.eat)
print(sonbyy.life_value)
sonbyy.eat()
print(sonbyy.life_value)
print(sonbyy.__dict__)
#当子类父类都有eat方法的时候,想要调用某一个方法的时候
sonbyy.eat()#狗在吃屎#调用子类的方法 Ainmal.eat(sonbyy) #调用父类的方法
print(sonbyy.life_value)# Ainmal.equipment(sonbyy)# 当父类中有的方法,子类没有但是想要调用,可以用此方法进行调用
print(sonbyy.argg) #100 #可以看到对象sonbyy的攻击力增加了

# 人类 狗类 相同的属性 提取了一个__init__方法,在这个方法里放一些共有的属性
# 猫类和狗类 相同的方法 直接把相同的方法提取出来,放在基类里

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

钻石继承

继承顺序

class D(object):
def t1(self):
print('D')
class B(D):
pass
# def t1(self):
# print('b')
class C(D):
pass
# def t1(self):
# print('C')
class A(B,C):
# def t1(self):
# print('A')
pass
f1=A()
f1.t1() #执行这个的时候,当对象中没有此方法的时候,会先去从父类B中去找有没有t1()方法,
# 没有的话再去父类D中去找,如果还没有的话就去大父类中去找f1()这个方法,
#这就是钻石继承的顺序
print(A.mro())#新式类可以用此方法打印继承顺序如下
#[<class '__main__.A'>, <class '__main__.B'>
# , <class '__main__.C'>, <class '__main__.D'>, <class 'object'>] #当大父类是class D(object):的新式类而不是class D:这种经典类类型
#的时候,当执行

新式类的继承顺序,广度优先

新式类广度优先

经典类广度优先

继承原理

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

>>> F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类

继承小结

继承的作用

减少代码的重用
提高代码可读性
规范编程模式

几个名词

抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
继承:子类继承了父类的方法和属性
派生:子类在父类方法和属性的基础上产生了新的方法和属性

抽象类与接口类

1.多继承问题
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口 2.方法的实现
在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

钻石继承

新式类:广度优先
经典类:深度优先

day25 python学习 继承,钻石继承的更多相关文章

  1. day25 python学习 继承,钻石继承 多态

    ---恢复内容开始--- 通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal: country='afdas' d ...

  2. 深入super,看Python如何解决钻石继承难题 【转】

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

  3. 深入super,看Python如何解决钻石继承难题

    1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...

  4. python之路----钻石继承

    钻石继承 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B ...

  5. (转载)深入super,看Python如何解决钻石继承难题

    1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...

  6. Python学习之单继承与多继承

    继承 面向对象编程语言的一个主要功能就是“继承”. 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. (1) 单继承:python同时支持类的继承 ...

  7. python学习日记(继承和多态)

    继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...

  8. Python学习 Day 8 继承 多态 Type isinstance dir __slots__

    继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ...

  9. Python学习---django模板继承180123

    django模板继承  --20180123 a.include 模板标签 b.extend(继承)模板标签 ------include 模板标签 该标签允许在(模板中)包含其它的模板的内容. 标签的 ...

随机推荐

  1. C++虚函数与多态

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写.(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函 ...

  2. UVA-1220 Party at Hali-Bula (树的最大独立集)

    题目大意:数的最大独立集问题.特殊在要求回答答案是否唯一. 题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根 ...

  3. 对象不能从 DBNull 转换为其他类型

    SQL语句:select sum (datediff(second,Begin_Time,End_Time)) as 总时长 from 数据表这是我开始的程序:int 总时长=0;总时长 =Conve ...

  4. asp.net GridView多行表头的实现,合并表头

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == Da ...

  5. textAlign

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  6. DB2 的事务日志

    1.     DB2事务日志:DB2的日志分主日志和次日志,主日志是在数据库第一次被连接和激活时创建的,而次日志是当写满所有的主日志后,才动态分配次日志,主日志和次日志受设置个数的制约,当配置的所有主 ...

  7. 无名管道跟dup,dup的使用

    参考资料: http://www.tldp.org/LDP/lpg/node11.html http://blog.csdn.net/yeyuangen/article/details/6852682 ...

  8. currentSession

    public  class  HibernateUtil  {  public static final ThreadLocal session =new ThreadLocal();  public ...

  9. 解密微信sqlite数据库

    最近在研究解密微信APP的数据库, 1.通过Android手机内置备份功能,可以获取到微信的数据库文件,再通过adb传到电脑上. 2.获取微信EnMicroMsg.db库的密码(通过IMEI和uin值 ...

  10. css div居中

    div中没有text-align和vehicle-align这两个属性,所在在css中设置这两个值没有作用 div 水平居中 设置左右边距有auto div{ margin: 0 auto; } 垂直 ...