python-day20面向对象三大特性之一:继承及c3算法

本文介绍了面向对象编程中的继承概念,包括单继承和多继承的特点及应用。通过实例详细讲解了继承如何提高代码复用性,减少冗余,并探讨了super关键字的使用及mro算法。

今日内容:

1.面向对象:继承

 

 

 

1.面向对象:继承

目的:提高代码的复用性,减少冗余

继承的称呼:

  1.父类--子类

  2.基类--派生类

  3.超类(父类)

 

1.1单继承:

格式:

# object是所有类的父类
class A(object):  # 规范写法,object也可省,默认不写继承于object
    pass

class B(A):   # B是A的子类,A是B的父类
    pass

猫狗的例子:

共同的属性,某些共同的方法,可以放在一个动物的大类中,让其继承。

class Animal(object):
    def __init__(self,name,kind):
        self.name = name
        self.kind = kind
    def eat(self,food):
        print('%s 吃 %s.'%(self.name,food))
    def drink(self):
        print('%s 喝水.'%self.name)
    def catch(self):
        print('%s catch mouse.'%(self.name))

class Cat(Animal):
    def climb(self):
        print('%s climb tree.'%(self.name))

class Dog(Animal):
    pass

cat = Cat('mao','黑猫')
dog = Dog('H','白狗')
print(cat.name)
dog.drink()

加载顺序:

注:Animal类上面还有一个object父类

dog对象调用drink方法的流程为:

先找到自己的对象空间,通过类指针找到父类Dog,通过父类指针找到Animal类执行的drink方法。

 

在子类进行重写父类方法,继续使用父类该方法的内容:

1.super关键字

  super().方法名(参数)         # 默认会传入当前对象

2.类名调用

  父类名.方法名(self,参数)    # 需要自己写上self

 

查看继承的类:

类名.__bases__   # 返回一个元祖

 

1.2多继承

多继承是python独有的一种。

新式类:   # 广度优先

  python3:默认所有类继承object,所有类都是新式类

  python2:类继承了object类为新式类

经典类:   # 深度优先

  python2:不写继承默认为经典类

 

广度优先:

如果有共同的根,不会先遍历到根,会走其他路遍历完,最后在遍历到根。

深度优先:

不管有没有共同的根,遍历到底,在遍历另一边,如果有共同的根,一条路遍历后另一条会在根前停止。

绿:广度优先         蓝: 深度优先

 该图的例子:

class A(object):
    pass

class B(A):
    pass

class C(A):
    pass

class D(B,C):
    pass

print(D.mro()) # 显示c3算法的的继承顺序
# [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

# c3算法 # 使用于广度优先
# A : [A0]   # 单继承一个O
# B : [BAO]  # 单继承A
# C : [CAO]  # 单继承A
# D : [DBCAO]  # 多继承B,C
# D的步骤:
# 1.D : D,[BAO],[CAO]   # 从左至右取
# 2.D :[DB],[AO],[CAO]  # 左边和右边出现一样的,取右边
# 3.D :[DBC],[AO],[AO]  # 取右边
# 4.D :[DBCA],[O],[O]   # 取了一样的删除左右相同的
# 5.D :[DBCAO],[],[]    # 取完

 

1.3 super要注意的

super调用父类方法是根据mro(3c算法)的顺序。

 

转载于:https://www.cnblogs.com/zezhou/p/10608382.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值