Python学习:15.Python面向对象(二、继承的各种情况)

一、什么是继承

继承是一种创建类的方法,在python中,一个类可以继承来自一个或多个父。原始类称为基类或超类。

#创建父类
class Parent1:
    pass

class Parent2:
    pass

# 继承父类,单继承
class Obj1(Parent1):
    pass

#继承父类,多继承
class Obj2(Parent1,Parent2):
    pass

二、什么时候使用继承

  在已经创建的几个类中,这几哥类中的方法和变量有相同的,这种时候我们就可以使用类的继承,将其它类中已有的方法和变量通过继承的方式,在新创建的类中,使用正常的方式就可以调用父类中的方法。剩下自己特有的方法只要在自己类中定义就可以。

  举个列子:人都会吃,喝,玩,小明也是一个人,所以小明也会,所以小明继承了人的属性,特别的是小明还会背古诗,就基于以上的说法写一个类的继承。

class Man:

    def eat(self):
        print(‘吃‘)

    def drink(self):
        print(‘喝‘)

    def play(self):
        print(‘玩‘)

class XiaoMing(Man):

    def recite(self):
        print(‘背古诗‘)

xm = XiaoMing()
xm.eat()
xm.recite()

输出结果:
吃
背古诗

三、单继承与多继承

单继承:仅仅继承一个父类,当查找方法的时候,首先在自己里面查找,然后到父类里面查找。

class Biology:
    def split(self):
        print(self.name+" accrue")

class Animal(Biology):#在类后面加括号加上所要继承类的名字,继承的是类的方法
    def GoWhoring(self):
        print("i like go whoring")
    def eat(self):
        print(self.name+" eat")

class superman:
    def gamble(self):
        print("gamble is interesting")
    def GoWhoring(self):
        print("beautiful whoring")

class Cat(Animal):
    def GoWhoring(self):
        print("i don‘t like go whoring")
    def __init__(self,name):
        self.name = name
    def cry(self):
        print(self.name + " 喵")
                                                    #优先级:自己,父类(左边,右边)
class Dog(Animal,superman):#在继承多个父类时,在两个父类都有同一个名字的方法时,优先选择括号左边的父类的方法
    def __init__(self,name):
        self.name = name
    def cry(self):
        print(self.name + " 汪")

mimi = Cat("mimi")
mimi.eat()
mimi.cry()                #当基类里方法存在,派生类里也存在同名方法,优先找派生类里的方法
mimi.GoWhoring() #当父类里有一个方法自己也有一个同名的方法时,默认使用自己的方法
husike = Dog("erha")#虽然Dog里没有eat和split但是由于Dog继承了Animal和的方法,而Animal继承了Biology的方法
husike.eat()            #所以Dog可以使用Biology的方法
husike.cry()            #父类有一个名字叫"基类"  子类有一个名字叫"派生类"
husike.split()
husike.GoWhoring()
faker = Animal()
faker.GoWhoring()#优先使用自己的方法

派生类可以继承基类里的所有功能。
当基类里方法存在,派生类里也存在同名方法,派生类优先找派生类里的方法(意思是优先找自己的)。
在Java、C#里面一个子类只能继承一个父类,多了报错,但是在python里可以继承多个父类

在经典类中,继承是以深度优先,在新式类中,继承是以广度优先。

Python 2.x中默认都是经典类,只有显式继承了object才是新式类。

python 3.x中默认都是新式类,经典类被移除,不必显式的继承object。

深度优先:

class A():
    def save(self):
        print("This is from A")
class B(A):
    pass
class C(A):
    def save(self):
        print("This is from C")
class D(B,C):
    pass

fun =  D()
fun.save()

输出结果:
This is from A"

深度优先的时候就是一条道走到黑,从左向右找,先把左边的一个里面的全部找完在找右边的。

 广度优先:

class A():
    def save(self):
        print("This is from A")
class B(A):
    pass

class C(A):
    def save(self):
        print("This is from C")
class D(B,C):
    pass

fun =  D()
fun.save()

输出结果:
This is from C

首先在左边的上一层父类中寻找,如果没有就到右边一个父类中寻找,没有就到左边父类的父类中寻找。

广度优先多种情况解析

情况一

有A、B、C、D、E几个类,A为B的父类,B为C的父类,E为D的父类,D为C的父类 现在C需要使用一个方法,只有在A,E里有,第一次C先去B中寻找没有找到 然后就会去A里面找,A里没有就去D里面找,然后再去E里找。

class A:
    def function(self):
        print("are you OK?A")

class B(A):
    def function_fake(self):
        print("are you OK?B")

class E:
    def function(self):
        print("are you OK?E")

class D(E):
    def function_fake(self):
        print("are you OK?D")

class C(B, D):
    def Sb(self):
        print("i am sb")

faker = C()
faker.function()

输出结果:
are you OK?A

括号里为查找顺序。

情况二

它会先把没有共同的父类寻找玩,然后再找共同的父类,因为在这种情况下它想找到和自己关系最近的。

class S:
    def function(self):
        print(‘are you Ok?S‘)

class A(S):
    def function_fake(self):
        print("are you OK?A")

class B(A):
    def function_fake(self):
        print("are you OK?B")

class E(S):
    def function(self):
        print("are you OK?E")

class D(E):
    def function_fake(self):
        print("are you OK?D")

class C(B, D):
    def Sb(self):
        print("i am sb")

faker = C()
faker.function()

输出结果:
are you OK?E

情况三

当A、B、D、E、都没有C所要找的函数时才会找右边的F(括号右边)

class F():
    def function(self):
        print("are you OK?F")

class A:
    def function_fake(self):
        print("are you OK?A")

class E:
    def function_fake(self):
        print("are you OK?E")

class B(A,F):
    def function_fake(self):
        print("are you OK?B")

class D(E):
    def function_fake(self):
        print("are you OK?D")

class C(B, D):
    def Sb(self):
        print("i am sb")

faker = C()
faker.function()

输出结果:
are you OK?F

情况四

首先面执行一个 c1 = C();c1.xxx() ,xxx在D里面而且xxx又执行了self.ooo() 而ooo在BDE里都有它会执行哪个?

class B:
    def ooo(self):
        print("B")

class E:
    def ooo(self):
        print("E")

class D(E):
    def xxx(self):
        self.ooo()

    def ooo(self):
        print("D")

class C(B, D):
    pass

c1 = C()
c1.xxx()

输出结果:
B

解析:首先找到c1.xxx在D里面,在D里面又执行了self.ooo(),这个self代指c1,而c1为C类的对象,意思还是c1.ooo,所以寻找ooo时还是从C开始,因为先找左边的所以,找到了B的ooo 以后找是谁执行的函数要看准self到底是谁的从self下手。

红色为第二次寻找路径(寻找ooo方法的次序)

今天的类的继承主要是多继承的时候父类中方法选择的。

原文地址:https://www.cnblogs.com/liudi2017/p/9297336.html

时间: 2024-08-01 05:07:50

Python学习:15.Python面向对象(二、继承的各种情况)的相关文章

Python学习第二天:面向对象之继承

继承:实现代码的重用,相同的代码不需要重复的编写. 1.继承的语法 ''' 专业术语: Dog类是Animal类的子类,Animal类是Dog类的父类,Dog类从Animal类继承 Dog类是Animal类的派生类,Animal类是Dog类的基类,Dog类从Animal类派生 ''' class Animal: def eat(self): print("吃") def drink(self): print("喝") def run(self): print(&qu

Python学习-15.Python的中的套接字socket

Python应用最广泛的要数web方面了.因此,socket显得十分重要. 要使用socket,必须引入socket模块,因此在Python脚本开头先写入 1 import socket 学过socket的都知道,就是客户端和服务端的通信. 因此新建client.py和server.py文件. 先编写server.py文件: 1 import socket 2 3 # 创建 TCP 协议的套接字. 4 server = socket.socket(socket.AF_INET,socket.SO

python学习笔记12-python面向对象

python学习笔记12-python面向对象 python一切皆对象 一.基本概念 1.面向对象和面向过程 面向对象编程:C++,Java,Python 面向过程编程:函数式编程,C程序等 2.类和对象 类:是对事物的抽象,比如:人类,球类 对象:是类的一个实例,比如:足球,篮球,对象就是对类的实例化 属性:五官,眼,鼻子,理解为一个变量,静态属性 方法:对人来说,吃穿住行,理解为一个函数,动态方法 实例说明:球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球实体出来 3.为什么要使

Python 学习之路(二)

Python 学习之路(二) 以下所用的是Python 3.6 一.条件语句 简单判断 1 if 判断条件: 2 执行语句-- 3 else: 4 执行语句-- 复杂判断 1 if 判断条件1: 2 执行语句1-- 3 elif 判断条件2: 4 执行语句2-- 5 elif 判断条件3: 6 执行语句3-- 7 else: 8 执行语句4-- 二.循环语句 2.1 while语句 和其他语言一样,不同的是多了else语句.在 python 中,while - else 在循环条件为 false

python学习31(面向对象)

类的两种类型:经典类:class Person():#没有继承objectPass 新式类:class Person(object):#继承objectpass 面向对象技术简介类(Class):用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用.数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据.方法重写:如果从父类继承的方法不

Python学习入门笔记(二):Python运算符

1.算术运算符 "+"加法:3+2=5 "-"减法:3-2=1 "*"乘法:3*2=6 "/"实数除法:3/2=1,3.0/2=1.5 "//"整数除法:5.6//2=2.0 "%"求余数:17%6=5 "**"求幂运算:2**3=8 2.赋值运算符 "="等于:x=3 "+="加等于:x+=2 "-="减等

C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

总结:Python学习 和 Python与C/C++交互

本篇仅仅是Python的学习和Python和C++数据对接过程中的一些总结. 由于工作的需要,用一周的时间学习 Python. Python是基于C实现的一门解释型语言,由于其易用性,俘获了不少开发者和运维的心.据说,Python 在科学计算领域,逐步吞噬着古老语言 Fortran的份额.这门语言是Google的第二语言,国内的知乎,豆瓣,都使用纯Python开发.Python的官方网站:http://www/python.org. 为了逐步完善的我们的数据库驱动服务,我们需要为客户提供更多,更

Python学习教程(Python学习路线+Python学习视频):Python数据结构

Python学习教程(Python学习路线+Python学习视频):Python数据结构   数据结构引言:   数据结构是组织数据的方式,以便能够更好的存储和获取数据.数据结构定义数据之间的关系和对这些数据的操作方式.数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式. 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式.    抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以