Python面向对象编程(二)

1.继承与派生

上文我们已经说过,Python中一切皆对象。我们从对象中抽取了共同特征和技能,得到了类的概念。类与类之间也有共同特征,我们可以从有共同特征和技能的类中提取共同的技能和特征,叫做父类。

比如老师和学生,都有名字,年纪,生日,性别等等,都会走,说话,吃饭。。。我们就可以从老师和学生中总结出来一个‘人’类,称为父类,那老师和学生就是‘人’类的子类,子类继承父类,就有了父类的特征和方法。

继承是一种什么‘是’什么的关系,继承是一种产生新类的方法,当然目的也是为了减少代码重用。

继承的 基本形式是:

立即学习“Python免费学习笔记(深入)”;

class People:    passclass Student(People):#People称为基类或者父类    pass

登录后复制

在Python中支持多继承,一个子类可以继承多个父类

我们可以通过__bases__的方法查看继承的所有父类,会返回一个元组。 

class People:    passclass Animals:    passclass Student(People,Animals):    passprint(Student.__bases__)#(, )print(People.__bases__)#(,)

登录后复制

可以看到,在People父类中,默认也继承了一个object类,这就是新式类和经典类的区别:
凡是继承了object类的类及其子类,都称为新式类,没有继承object类的类,称为经典类。

在Python 3中,默认就是新式类,而在Python2.X中,默认都是是经典类

继承怎么减少代码呢?看例子

class People:    def __init__(self,name,age):        self.name=name        self.age=age    def walk(self):        print('%s is walkig'%self.name)class Teacher(People):    def __init__(self,name,age,level):        People.__init__(self,name,age)        self.level=levelt1=Teacher('zhang',18,10)print(t1.level) #10print(t1.name)  #zhang          子类可以用父类定义的属性t1.walk()   #zhang is walking   子类无需定义就可以用父类的方法print(issubclass(Teacher,People))   #True查看Teacher类是不是People类的子类

登录后复制

从上面的例子中可以看到,Teacher类继承了父类People类,但是Teacher又有自己特有的属性level,子类也可以定义自己独有的方法,甚至可以和父类的方法重名,但是执行时会以子类定义的为准。

这就叫做派生

2.组合

继承是解决什么‘是’什么的问题,那还有一种场景就是什么有什么,比如老师有生日,学生也有生日,生日有年月日这些属性,如果每个类都写的话,又是重复代码。但是又不能让学生和老师继承生日类。这时就用到了组合。组合就是解决什么‘有’什么的问题。看例子

class Date:    def __init__(self,year,mon,day):        self.year=year        self.mon=mon        self.day=day    def tell_birth(self):        print('出生于%s年%s月%s日'%(self.year,self.mon,self.day))class Teacher:    def __init__(self,name,age,year,mon,day):        self.name=name        self.age=age        self.birth=Date(year,mon,day)t=Teacher('egon',19,2010,10,10)print(t.birth)          #t.birth.tell_birth()    #出生于2010年10月10日

登录后复制

什么?嫌参数太多?*args学过吧,你高兴就好

Python面向对象编程(二)Python面向对象编程(二)

 1 class Date: 2     def __init__(self,year,mon,day): 3         self.year=year 4         self.mon=mon 5         self.day=day 6     def tell_birth(self): 7         print('出生于%s年%s月%s日'%(self.year,self.mon,self.day)) 8  9 class Teacher:10     def __init__(self,name,age,*args):11         self.name=name12         self.age=age13         self.birth=Date(*args)14 t=Teacher('egon',19,2010,10,10)15 print(t.birth)          #16 t.birth.tell_birth()    #出生于2010年10月10日

登录后复制View Code

3.抽象类与接口

继承有两种用途:1.代码重用,子类继承父类的方法

        2.声明某个子类兼容于某父类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

需要注意的是,Python中并没有接口的关键字,我们只能是模仿接口的功能
比如在 Python中,一切皆文件嘛,那程序是文件,硬件是文件,文本文档也是文件,我们知道什么叫文件呢,就是能读能写,那程序,文本文档这些,都应该有读和写的功能,我们来模拟一下

Python面向对象编程(二)Python面向对象编程(二)

class Interface:    def read(self):        pass    def write(self):        pass        class Txt(Interface):    def read(self):        print('文本文档的读取方式')    def write(self):        print('文本文档的写入方式')        class Sata(Interface):    def read(self):        print('硬盘文件的读取方式')    def write(self):        print('硬盘文件的写入方式')class process(Interface):    def read(self):        print('进程数据的读取方式')    def write(self):        print('进程数据的写入方式')

登录后复制View Code

这么做的意义就是:我们不需要知道子类有什么具体的方法,既然他们继承了文件类,那他们就是文件,那他们就有读和写这两个功能

父类限制了子类子类必须有read和write这两个方法,而且名字也必须一样(当然现在只是我们主观上的限制,一会我们说完抽象类,就可以从代码级别上限制了),这样就实现了统一,模拟了接口的概念,这就是归一化设计。在归一化设计中,只要是基于一个接口设计的类,那么所有的这些类实例化出来的对象,在用法上是一样的

我们再来说一下抽象类:

Python中的抽象类需要导入一个模块来实现。抽象类只能被继承,不能被实现

抽象类的写法:

import abcclass File(metaclass=abc.ABCMeta):    @abc.abstractmethod    def read(self):        pass    @abc.abstractmethod    def write(self):        pass#父类使用了抽象类,那子类就必须继承父类的方法,而且名字也必须一样#这样就实现了代码级别的限制class Txt(File):    def read(self):        print('文本文档的读取方式')    def write(self):        print('文本文档的写入方式')

登录后复制

 

4.继承的实现原理

1)继承顺序:

python支持多继承,当一个类继承多个父类时,继承顺序是怎样的呢?这个顺序在新式类和经典类中是不一样的。

在新式类中,继承顺序是广度优先,在经典类中是深度优先,举个栗子:

Python面向对象编程(二)图不重要,看内容
在这个图中,H是子类,H继承E,F,G,E,F,G,又分别继承B,C,D,B,C,D,同时继承A

在新式类中的顺序是:H E B F C G D A 

在经典类中的顺序是:H E B A F C G D

2)继承原理:

当我们定义一个类后,Python就会根据上面的继承规律解析出一个继承顺序的列表(MRO列表),可以通过mro()查看,但是这个方法只有在新式类中才有,经典类没有

Python面向对象编程(二)mro

 

以上就是Python面向对象编程(二)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268325.html

(0)
上一篇 2025年2月27日 10:40:48
下一篇 2025年2月27日 10:41:05

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 编程现在学什么语言好

    对于初学者来说,推荐学习Python或JavaScript,而随着经验的增长,还可以考虑掌握Java、C++或C#。 编程现在学什么语言好 随着科技的飞速发展,掌握编程语言已成为一项必备技能。选择一门编程语言对于初学者来说可能是一项艰巨的任…

    2025年2月27日
    000
  • 程序语言有哪几种语言

    程序语言有以下类型:通用编程语言(C、C++、Java、Python、C#)脚本语言(JavaScript、PHP、Ruby、Bash)标记语言(HTML、XML、JSON)汇编语言(MASM、ARM Assembly) 程序语言类型 程序…

    2025年2月27日
    200
  • 电脑编程入门学什么语言

    对于初学者来说,理想的入门编程语言应具备易学性、充足的资源和广泛的应用领域。推荐的入门语言依次是:PythonJavaC#JavaScriptHTML 和 CSS 电脑编程入门学什么语言? 对于电脑编程入门者,选择合适的语言非常重要。理想的…

    2025年2月27日
    200
  • 推荐几本关于的Python好书

    不可错过的十本python好书,分别适合入门、进阶到精深三个不同阶段的人来阅读,感兴趣的小伙伴们可以参考一下 以往的文章中小编已经给大家陆续推荐了很多的Python书籍,可以说品种齐全、本本经典了,不知道你是不是已经眼花缭乱,不知道该选择哪…

    2025年2月27日 编程技术
    200
  • 电脑软件编程用什么语言

    计算机软件编程有多种语言,最常见的是:1. Python(数据科学、人工智能);2. Java(企业应用程序、安卓);3. C++(系统软件、游戏);4. C#(Windows/Web/移动);5. JavaScript(Web 开发);6…

    2025年2月27日
    200
  • Python面向对象的知识总结

    封装 1.为什么要封装? 封装就是要把数据属性和方法的具体实现细节隐藏起来,只提供一个接口。封装可以不用关心对象是如何构建的 2.封装包括数据的封装和函数的封装,数据的封装是为了保护隐私,函数的封装是为了隔离复杂度 3.数据的封装就是在属性…

    编程技术 2025年2月27日
    200
  • 现在编程主流语言是什么语言

    当今编程领域的主流语言是:Python、Java 和 JavaScript。Python:通用语言,适用于数据科学、机器学习等领域,以易学性著称。Java:面向对象语言,用于开发大型应用程序,以健壮性、安全性和跨平台兼容性见长。JavaSc…

    2025年2月27日
    200
  • 网络编程详细介绍

    python内置封装了很多常见的网络协议的库,因此python成为了一个强大的网络编程工具,这里是对python的网络方面编程的一个简单描述。 urllib 和 urllib2模块 urllib 和urllib2是python标准库中最强的…

    编程技术 2025年2月27日
    200
  • 目前主流的编程语言和工具

    软件开发中备受推崇的编程语言和工具主要有:主流编程语言:Python、Java、C++、JavaScript、C#主流工具:IDE、版本控制系统、容器、测试框架、API 管理工具 主流编程语言和工具 当下,在软件开发领域,有众多备受推崇的编…

    2025年2月27日
    200
  • 现在比较主流的编程是什么

    当今主流编程语言包括:Python(人工智能)、Java(跨平台应用程序)、JavaScript(交互式网页)、C++(游戏开发)和C#(Microsoft .NET 框架)。选择合适的语言取决于需求、技能水平和职业目标。 主流编程语言 在…

    2025年2月27日
    200

发表回复

登录后才能评论