热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:DAY18面向对象三大特性之继承

本文由编程笔记#小编为大家整理,主要介绍了DAY18面向对象三大特性之继承相关的知识,希望对你有一定的参考价值。继承
本文由编程笔记#小编为大家整理,主要介绍了DAY18 面向对象三大特性之继承相关的知识,希望对你有一定的参考价值。


继承

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

  在python3.x版本中,所有的类都默认继承object类。

1.继承与重用

  首先,我们来看看一个例子:


# 猫类:吃喝睡,爬树
# 狗类:吃喝睡,看家
#一。通过之前对面向对象的学习,我们可以轻易的定义出这两个类来:
class Cat:
def __init__(self,name,kind,food):
self.name = name
self.kind = kind
self.food = food
def eat(self):
print(‘%s吃%s‘%(self.name,self.food))
def drink(self):
print(‘%s喝水‘%self.name)
def sleep(self):
print(‘%s在睡觉‘%self.name)
def climb(self):
print(‘%s在爬树‘%self.name)
class Dog:
def __init__(self,name,kind,food):
self.name = name
self.kind = kind
self.food = food
def eat(self):
print(‘%s吃%s‘%(self.name,self.food))
def drink(self):
print(‘%s喝水‘%self.name)
def sleep(self):
print(‘%s在睡觉‘%self.name)
def look_after_home(self):
print(‘%s在看家‘%self.name)

  但是再往深入探讨,我们会发现其实编写的猫类和狗类代码中,很多都冗余代码。有什么方式能够把重复的代码提取出来吗?当然有,这时候就可以用到继承的思想,父类中的所有属性和方法都可以被子类使用。


#二。把冗余的代码提出来,抽象出一个宠物类,让猫类和狗类都继承这个宠物类。
class Pet:
def __init__(self,name,kind,food):
self.name = name
self.kind = kind
self.food = food
def eat(self):
print(‘%s吃%s‘%(self.name,self.food))
def drink(self):
print(‘%s喝水‘%self.name)
def sleep(self):
print(‘%s在睡觉‘%self.name)
class Cat(Pet):
def climb(self):
print(‘%s在爬树‘%self.name)
class Dog(Pet):
def kanjia(self):
print(‘%s在看家‘%self.name)
tom = Cat(‘Tom‘,‘暹罗猫‘,‘猫粮‘) #子类使用名字(静态变量和方法),如果在子类中没有,就使用父类的
hei = Dog(‘小黑‘,‘二哈‘,‘狗粮‘)
tom.climb()
hei.kanjia()

2.继承与派生

  子类也可以定义自己特有的属性或者重新这些属性(但并不会影响到父类),一旦定义了自己的属性且与父类同名时,这种属性称为派生属性。子类的对象调用这个属性时,会直接选择子类中的。


class Pet:
def __init__(self,name,kind,food):
print(‘IN PET‘)
self.name = name
self.kind = kind
self.food = food
def eat(self):
print(‘%s吃%s‘%(self.name,self.food))
def drink(self):
print(‘%s喝水‘%self.name)
def sleep(self):
print(‘%s在睡觉‘%self.name)
class Cat(Pet):
def __init__(self,name,kind,food,eye_color):
print(‘IN CAT‘)
self.eye_color = eye_color #派生属性
# Pet.__init__(name,kind,food)
super().__init__(name,kind,food) #super方法,可以省去self
def climb(self):
print(‘%s在爬树‘%self.name)
class Dog(Pet):
def kanjia(self):
print(‘%s在看家‘%self.name)
tom = Cat(‘阿猫‘,‘橘猫‘,‘猫粮‘,‘绿色‘)
print(tom.eye_color)


# 派生经典考题:
class Foo:
def __init__(self):
self.func()
def func(self):
print(‘in tho foo‘)
class Son(Foo):
def func(self):
print(‘in the son‘)
s1 = Son()
>>>
in the son
################
当self去调用某个方法的时候,不要看self在哪里,而是要明确self代表的到底是谁。

  派生总结:

  1.当子类中方法要被调用的时候,子类的对象会直接选择子类中的方法。

  2.父类的方法不会被自动执行。

  3.如果我们既要执行子类的方法又要执行父类中的方法,那么需要在子类的方法中调用父类的方法,有以下两种方法:

  (1)父类名.方法名(self,参数...)

  (2)super().方法名(参数...)   #关于super的查找顺序,请继续往下看。

3.抽象类

  抽象类在python中使用的不是特别多,但是在以后的工作中,公司有可能会使用抽象类来制定开发的规则,在以后看源码的过程中,也可能会碰到抽象类的概念。试想一个场景:在今后的多人开发,功能复杂,许多后期拓展功能的项目中,代码的规范变得尤其的重要,而此时,抽象类就能够起到一个很好的模板作用。

  抽象类只是一个模板的规范,基本不会实现什么功能,所以抽象类是不可以被实例化的。


#定义抽象类,需要引入一个模块。
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): #抽象类必须继承一个叫ABCMeta的类
@abstractmethod #抽象类规定的方法,用abstractmethod装饰器装饰,规定了
def pay(self):pass 后面凡是继承该抽象类的子类都必须有一个同名的方法。
class Alipay(Payment):
def pay(self,money):
print(‘使用支付宝支付了%s元‘%money)

4.多继承

  在python中允许一个子类是可以继承多个父类的。


class ParentClass1: #定义父类1
pass
class ParentClass2: #定义父类2
pass
class ChildClass(ParentClass1): #定义子类(继承父类1) 单继承
pass
class ChildClass2(ParentClass1,ParentClass2): #多继承
pass

  “__base__”:显示子类的一个父类。

  “__bases__”:显示子类的所有父类。

5.新式类与经典类

  python3.x所有的类都是新式类,所有的新式类都有一个默认继承的父类,叫做object类。

  python2.7中经典类和新式类并存。

    class Student:Pass   #经典类

    class Student(object):pass  #新式类

  总结:

  (1)继承了object的类都是新式类。

  (2)在py3中所有的类都是新式类。

  (3)在py2中既有新式类也有经典类。

 

  一.多继承的顺序/新式类和经典类之间的区别?

 (1)钻石继承:广度优先。

  新式类的所有多继承关系寻找方法的顺序--->遵循广度优先。

  mro()--->显示多继承的继承顺序。

  super()--->super方法不是单纯的寻找父类,在多继承中,是遵循mro循序的。


class A:
def func(self):
print(‘A‘)
class B(A):
def func(self):
super().func()
print(‘B‘)
class C(A):
def func(self):
super().func()
print(‘C‘)
class D(B,C):
def func(self):
super().func()
print(‘D‘)
d = D()
d.func()
print(D.mro()) #新式类遵循广度优先。
>>>
A
C
B
D
[, , , , ]

  技术分享图片

 总结:

  新式类在多继承时,遵循广度优先。

  经典类在多继承时,遵循深度优先。

  



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
mobiledu2502889521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有