python面向对象之继承与派生

一、继承

继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类。

python中类的继承分为:单继承和多继承,如果是多继承的话,继承顺序有深度和广度2种

示例:

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

查看继承:

示例:

>>> SubClass1.__bases__
(<class ‘__main__.ParentClass1‘>,)
>>> SubClass2.__bases__
(<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

示例:

>>> ParentClass1.__bases__
(<class ‘object‘>,)
>>> ParentClass2.__bases__
(<class ‘object‘>,)

继承同时具有两种含义

含义一.继承基类的方法,并且做出自己的改变或者扩展(代码重用)

含义二.声明某个子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法

继承最大的好处是减少重用的代码

示例:

class hero:#父类
    def __init__(self,nickname,aggressivity=58,life_value=455,):
        self.nickname=nickname
        self.aggressivity=aggressivity
        self.life_value=life_value

    def attack(self,enemy):
        enemy.life_value-=self.aggressivity
        print(enemy.life_value)
class Garen(hero):#子类继承父类hero
    camp=‘Demacia‘#这个英雄人物全部继承父类的内容,只有阵营不一样
class Riven(hero):#子类继承父类hero
    #这个英雄人物全部继承父类的内容,只有阵营不一样
    camp=‘Noxus‘
g1=Garen("无敌")
# print(g1)
r1=Riven("萌萌")
g1.attack(r1)#攻击萌萌

执行结果是:

397

上述代码都继承了hero英雄的类,所以有类里面共同的属性,极大的减少了代码的重用性

二、派生

然而,继承有时在应用场景中并不能满足需求,有时子类也需要添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。所以这一概念就相当于是“派生”

派生:首先继承父类的,再定义自己的构造方法

用上述例子在此示例:

class hero:#父类
    def __init__(self,nickname,aggressivity=58,life_value=455,):
        self.nickname=nickname
        self.aggressivity=aggressivity
        self.life_value=life_value

    def attack(self,enemy):
        enemy.life_value-=self.aggressivity
        print(enemy.life_value,‘Hero attack‘)

class Garen(hero):#子类继承父类hero
    camp=‘Demacia‘
    def __init__(self,nickname,aggressivity=58,life_value=455,money=100):
        hero.__init__(self,nickname,aggressivity=58,life_value=455,)#调用父类的函数__init__(self,nickname,aggressivity=58,life_value=455,)
        self.money=money#派生出自己的新特色功能出来
    def attack(self,enemy,tiao):
        hero.attack(self,enemy)#调用父类的函数attack(self,enemy)
        self.tiao=tiao#派生出自己的新特色功能出来
        print(‘from garen attack‘)
    def file(self):#新加技能
        print("%s is filing"%self.nickname)

class Riven(hero):#子类继承父类hero
    #这个英雄人物全部继承父类的内容,只有阵营不一样
    camp=‘Noxus‘

g1=Garen("无敌")
g1.file()#打印新加的技能
print(g1.money)#打印新加的money值
# print(g1)
r1=Riven("萌萌")
g1.attack(r1,"enemy")#攻击萌萌
g1.attack(r1,"enemy")#攻击萌萌

其执行结果是:

无敌 is filing
100
397 Hero attack
from garen attack
339 Hero attack
from garen attack

 

关于继承的顺序:

继承在Python不同版本中是有区别的

python3: 新式类(广度优先)

pyhon2: 新式类(广度优先)与经典类(深度优先)

示例说明:

新式类的继承顺序如下图:(python2和python3中都一样)

用代码是:

class A:
    def __init__(self):
        print(‘A的构造方法‘)
class B(A):
    def __init__(self):
        print(‘B的构造方法‘)
    pass
class C(A):
    def __init__(self):
        print(‘C的构造方法‘)
    pass
class D(B):
    def __init__(self):
         print(‘D的构造方法‘)
    pass
class E(C):
    def __init__(self):
        print(‘E的构造方法‘)
    pass

class F(D,E):
    def __init__(self):
        print(‘F的构造方法‘)
    pass
f1=F()#实例化触发运行

执行顺序是:

F——》D——》B——》E——》C——》A——》object

经典类的实现是:(仅仅只有Python2中有)

经典类的继承顺序如下图:(深度优先)

用代码是实现是:

#python2中经典类的继承,在查找属性时遵循:深度优先
class A:
    # def test(self):
    #     print(‘from A‘)
    pass
class B(A):
    # def test(self):
    #     print(‘from B‘)
    pass
class C(A):
    # def test(self):
    #     print(‘from C‘)
    pass
class D(B):
    # def test(self):
    #     print(‘from D‘)
    pass

class E(C):
    # def test(self):
    #     print(‘from E‘)
    pass
class F(D,E):
    # def test(self):
    #     print(‘from F‘)
    pass
f1=F()
f1.test()

# F->D->B->A->E->C

 执行顺序是:

 F->D->B->A->E->C

查看python如何实现的继承(使用类名.mor()查看)

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.如果对下一个类存在两个合法的选择,选择第一个父类

时间: 2024-12-05 06:46:34

python面向对象之继承与派生的相关文章

python之旅:面向对象之继承与派生

一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 一个类继承另一个类时,他将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法. python中类的继承分为

Day7 初识面向对象,面向对象之继承与派生

一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序:人狗大战 角色:人.狗 人角色特性:攻击力.生命值.名字.等级 狗角色特性:攻击力.生命值.名字.品种 1.用函数实现功能:角色和技能分别定义不同的函数 1 def person(attack,life_value,name,level): 2 person_dic = {'attack':att

Python面向对象特性 - 继承

面向对象有3大特性:继承.多态.封装,本章介绍 Python中的 继承 特性~? 什么是继承 继承是创建类的一种方式,在 Python中支持多继承,即在创建类的时候可以继承一个或者多个父类.在继承关系中,被继承的类通常称为父类(或超类,基类),新建的类则称为子类(或派生类).?继承的优势在于可以有效地重用代码,提高代码的可读性~?继承示例: class Fu_1: # 父类 pass class Fu_2: # 父类 pass class Zi_1(Fu_1): # 单继承 pass class

面向对象(二)——继承、派生、组合以及接口

一.继承与派生 1.1 什么是继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 Python中类的继承分为:单继承和多继承 class People: # 定义父类 def __init__(self,name,age): self.name=name self.age=age def walk(self): print('%s is walking' %self) class Teacher(People): #

面向对象之继承与派生

阅读目录 一 初识继承 二 继承与抽象(先抽象再继承) 三 继承与重用性 四 派生 五 组合与重用性 六 接口与归一化设计 七 抽象类 八 继承实现的原理(可恶的菱形问题) 九 子类中调用父类的方法 一 初识继承 什么是继承 继承指的是类与类之间的关系,是一种什么是什么的关系,功能之一就是用来解决代码重用问题(比如练习7中Garen与Riven类有很多冗余的代码) 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 pyt

python面向对象之继承/多态/封装

老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(self,name,speed,load,power): self.name = name self.speed = speed self.load = load self.power = power def run(self): print("开动啦.") class Benz(Vehicle

面向对象的继承和派生

一.继承 1.什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 子类会“”遗传”父类的属性,从而解决代码重用问题(比如练习7中Garen与Riven类有很多冗余的代码) 2.python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1):

python -- 面向对象编程(继承、重写)

一.继承 子类可以继承父类的所有公有成员,但不能直接访问父类的私有成员,只能通过父类的公有方法间接访问私有属性或私有方法. 如: class DerviedClassName(BaseClassName1[,BaseClassName2,......]): 语句1 语句2 ....... 语句N 公有属性既可以在类的内部进行访问,也可以在外部程序中使用. 派生类(子类)继承了基类(父类)的行为和属性之后,还可以增加某些特定的行为和属性. 继承分为单继承和多继承 A.单继承 # ---------

oldboy twentieth day . I love Python. 面向对象之 继承 :

继承:子类 (派生类) 继承的父类 (基类) 的一切 继承最大的特点: 节省代码; 与其他类发生关联. 为什么 子类 能找到父类的所有? 因为存在 父类指针的概念 继承的分类: 1, 版本分类: Python3.x: 类默认都继承object类, 继承object类的类叫做新式类 Python2.x: 类默认什么都不继承, 不继承object的类叫做经典类. 如果在python2.x 中 你让他继承object类, 就变成了新式类. 2, 按照继承分类: 单继承: 查询顺序一直向上( 新式类,