python面向对象之继承

面向对象之继承

什么是面向对象的继承?

继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称

为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而

不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的

原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 一般静态的面向

对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。

class Person:def __init__(self,name,sex,age):self.name =nameself.age = ageself.sex = sex
class Cat:def __init__(self,name,sex,age):self.name = nameself.sex =sexself.age =age
class Dog:def __init__(self,name,age,sex):self.name =nameself.sex =sexself.age = age
# 定义三个不同的类class Animal(object):def __init__(self,name,sex,age):self.name = nameself.sex = sexself.age = age
# 定义一个Animal父类
class Person(Animal):pass
class Dog(Animal):pass
class Person(Animal):pass
# 派生三个子类

继承的优点:

  • 增加了类的耦合性(耦合性不宜多,宜精)。
  • 减少了重复代码。
  • 使得代码更加规范化,合理化。

继承的分类

父类,又叫基类,超类,上面例子中的Animal就是一个父类。

子类,派生类,由父类派生而成的类,可以调用父类的静态属性和动态方法。

继承:可以分单继承,多继承

经典类和新式类:

  • 在python2.2版本之前均为经典类,python2.2之后新式类和经典类并存,python3之后取消了经典类的概念、

  • 简单来说,在python2x基类的根如果什么也不写就是经典类,如果python的根为object就为新式类

  • python3x版本中只有一种类:

    python3中使⽤的都是新式类. 如果基类谁都不继承. 那这个类会默认继承 object

单继承

类名,对象执行父类方法

class Aniaml(object):type_name = '动物类'def __init__(self,name,sex,age):self.name = nameself.age = ageself.sex = sexdef eat(self):print(self)print('吃东西')class Person(Aniaml):passclass Cat(Aniaml):passclass Dog(Aniaml):pass# 类名:
print(Person.type_name)  # 可以调用父类的属性,方法。
Person.eat(111) 
print(Person.type_name)

执行顺序

class Animal(object):    # 1type_name = "动物类"   # 6def __init__(self,name,sex,age):  # 7self.name = name  # 8self.sex = sex   # 9self.age = age   # 10def eat(self):print(self)print("吃东西")
class Person(Animal):    # 2def eat(self):   # 11print("%s 吃饭"%self.name)  # 13
class Cat(Animal):      # 3pass
class Dog(Animal):      # 4pass
p1 = Person("alex","laygirl",34)   # 5
p1.eat()  #  12
# 结果:
alex 吃饭
# 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找。
# 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。

同时执行类以及父类中的方法

1.方法一:

如果想执行父类的func方法,这个方法并且子类中也用,那么就在子类的方法中写上:

父类.func(对象,其他参数)

class Aniaml(object):type_name = '动物类'def __init__(self,name,sex,age):self.name = nameself.age = ageself.sex = sex   # 继承父类中的三个静态属性def eat(self):print('吃东西')class Person(Aniaml):def __init__(self,name,sex,age,mind):Aniaml.__init__(self,name,sex,age)  # 方法一self.mind = mind   # 封装mind属性def eat(self):super().eat()print('%s 吃饭'%self.name)
class Cat(Aniaml):passclass Dog(Aniaml):pass
p1 = Person('春哥','laddboy',18,'有思想')
print(p1.__dict__)

2.利用super,super().func(参数)(父类的重构

class Animal:def __init__(self,name,sex,age):self.name = nameself.sex = sexself.age = agedef eat(self):print("动物都需要吃饭")
class Human(Animal):def __init__(self,name,sex,age,hobby):super(Human,self).__init__(name,sex,age)  # 继承父类中的三个静态属性self.hobby = hobbydef eat(self):super().eat()  # 执行父类中的eat方法print(f"{self.name}都需要吃饭")
class Dog(Animal):pass
class Cat(Animal):pass
H1 = Human("小红","女",18,"看书")
H1.eat()
# 结果:
"动物都需要吃饭"
"小红都需要吃饭"

单继承经典练习题:

# 1
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)class Foo(Base):pass
obj = Foo(123)
obj.func1() # 123 运⾏的是Base中的func1  # 2      
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)
class Foo(Base):def func1(self):print("Foo. func1", self.num)
obj = Foo(123)
obj.func1() # Foo. func1 123 运⾏的是Foo中的func1       # 3         
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)
class Foo(Base):def func1(self):print("Foo. func1", self.num)
obj = Foo(123)
obj.func1() # Foo. func1 123 运⾏的是Foo中的func1     
# 4
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print("Base.func2")
class Foo(Base):def func2(self):print("Foo.func2")
obj = Foo(123)
obj.func1() # 123 Foo.func2 func1是Base中的 func2是⼦类中的 
# 再来
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print(111, self.num)
class Foo(Base):def func2(self):print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:obj.func2() # 111 1 | 111 2 | 222 3# 再来
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print(111, self.num)
class Foo(Base):def func2(self):print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:obj.func1() # 那笔来吧. 好好算

多继承

class A:def __init__(self,name):self.name = namedef show_name(self):print(f"A的名字为{self.name}")
class B:def __init__(self,name):self.name = namedef show_name(self):print(f"B的名字为{self.name}")
class C(A,B): # C同时继承A,B类pass
c = C("A")
print(c.name)
c.show_name()

在python这种,经典类和新式类继承父类所使用的算法是完全不同的

经典类的多继承

经典类的多继承采用深度优先算法

class A:pass
class B(A):pass
class C(A):pass
class D(B, C):pass
class E:pass
class F(D, E):pass
class G(F, D):pass
class H:pass
class Foo(H, G):pass

1729998-20190807113226947-822370988.jpg

类的: Foo-> H -> G -> F -> E -> D -> B -> A -> C.

新式类的多继承

mro序列

MRO是一个有序列表L,在类被创建时就计算出来

通用计算公式为:

mro(Chird(Base1,Base2)) = [child] + merge(mro(Base1),mro(Base2),[Base1,Base2])
# 其中child继承自Base1,Base2

如果继承一个基类:class B(A)

这时候B的mro序列为

mro(B) = mro(B(A))
= [B] + merge(mro(A) + [A])
= [B] + merge([A] + [A])
= [B,A]

如果继承至多个基类:class B(A1,A2,A3)

mro(B) = mro( B(A1, A2, A3 …) )
= [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] )
= ...

计算结果为列表,列表中至少有一个元素即类自己,如上述示例[A1,A2,A3],merge操作是C3算法的核心

表头和表尾

表头:
  列表的第一个元素

表尾:
  列表中表头以外的元素集合(可以为空)

示例
  列表:[A, B, C]
  表头是A,表尾是B和C

列表之间的+操作

+操作:

[A] + [B] = [A, B]

(以下的计算中默认省略)

如计算merge( [E,O], [C,E,F,O], [C] )
有三个列表 :  ①      ②          ③
merge不为空,取出第一个列表列表①的表头E,进行判断                              各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
取出列表②的表头C,进行判断C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
进行下一次新的merge操作 ......
---------------------

计算mro(A)方式:

mro(A) = mro( A(B,C) )原式= [A] + merge( mro(B),mro(C),[B,C] )mro(B) = mro( B(D,E) )= [B] + merge( mro(D), mro(E), [D,E] )  # 多继承= [B] + merge( [D,O] , [E,O] , [D,E] )  # 单继承mro(D(O))=[D,O]= [B,D] + merge( [O] , [E,O]  ,  [E] )  # 拿出并删除D= [B,D,E] + merge([O] ,  [O])= [B,D,E,O]mro(C) = mro( C(E,F) )= [C] + merge( mro(E), mro(F), [E,F] )= [C] + merge( [E,O] , [F,O] , [E,F] )= [C,E] + merge( [O] , [F,O]  ,  [F] )  # 跳过O,拿出并删除= [C,E,F] + merge([O] ,  [O])= [C,E,F,O]原式= [A] + merge( [B,D,E,O], [C,E,F,O], [B,C])= [A,B] + merge( [D,E,O], [C,E,F,O],   [C])= [A,B,D] + merge( [E,O], [C,E,F,O],   [C])  # 跳过E= [A,B,D,C] + merge([E,O],  [E,F,O])= [A,B,D,C,E] + merge([O],    [F,O])  # 跳过O= [A,B,D,C,E,F] + merge([O],    [O])= [A,B,D,C,E,F,O]
---------------------

转载于:https://www.cnblogs.com/lifangzheng/p/11314321.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国正面临“人才泡沫”破裂危机?

(Jason Lane和Kevin Kinser/文)最近,与教育有关的种种问题在美国社会引起了广泛讨论。首先巨额的学生贷款问题:根据美联储纽约分行在2012年11月发布的一份报告,全美学生贷款总额已经达到420亿美元,其中新增…

ngrx学习笔记

什么是ngrx ngrx是Angular基于Rxjs的状态管理,保存了Redux的核心概念,并使用RxJs扩展的Redux实现。使用Observable来简化监听事件和订阅等操作。 在看这篇文章之前,已经假设你已了解rxjs和redux。 有条件的话请查看官方文档进行学习理解。 所…

.slice(0)

高手代码里看到.slice(0),查了下这样写的好处: 1.对原数组进行深拷贝,这样进行一系列操作的时候就不影响原数组了; 2.将类数组对象转化为真正的数组对象:var anchorArray [].slice.call(document.getElementsByTagN…

亲历2013年TED大会:全球最潮灵感大会

本文转自:http://mooc.guokr.com/opinion/436837/ 本文由《外滩画报》供稿 文/华琪(发自美国) 编辑/吴慧雯 什么是TED的世界?在这里,你可以轻易发现各种名人出没的痕迹,和各个领域里最具远见卓识和创造…

Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视。我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整理架构. 设计电商会员体系需…

为什么要上大学?

为了让自己成为更有意思的人。 (文/美国圣母大学哲学教授 Gary Gutting)再不久,千千万万的大学生又将走完一个学期。他们中的很多人以及他们的家人,可能为刚刚过去的几个月或是几年投入了相当可观的时间、努力以及金钱…

打造“神犇”是教育的未来吗?

这年头,品学兼优、身怀特长的“神犇”,拼的不仅是天赋异禀和后天努力,更是身后爹妈的钱包,而本该实现社会公平的教育,反而加速和凝固了社会的不公。 高等教育的终极目标真的是造就学业超人吗?《纽约时报》刊…

AntD 官网样例 InputRef报错原因

在官网可编辑表格typescript样例里 const inputRef useRef<InputRef>(null); InputRef项目报错原因是ant design的版本问题! antd 4.19版本重写了input 可通过InputRef来使用input组件的ref

AntD 可编辑行表格

本地数据代码模板自用,官网例子改改 // 编辑行的自定义表格 import React, { useState } from "react"; import {Table,Input,InputNumber,Popconfirm,Form,Typography,Divider, } from "antd";interface Item {key: string;name: string;age: number;add…

三心二意,助你好运?

经验说&#xff1a;做事要专心致志。 实验说&#xff1a;专心致志常常让人缺少一双发现的眼睛。 专心致志从来都被当做一个美德来歌颂。从来我们就认为要想成为伟大的人就必须要像牛顿老师那样把钟当成吃的放到锅里煮才行&#xff0c;至少至少也得有能在集市上看书的本事。否则…

React Antd Upload自定义上传customRequest

单独的上传图片接口要传参,action方式不太适合,需要使用自定义上传customRequest覆盖 公司代码不可弄,就发一个可用的demo例子 import React, { useState } from "react"; import { render } from "react-dom"; import "antd/dist/antd.css"; i…

HDU 4109 Instrction Arrangement

题目链接&#xff1a;https://vjudge.net/problem/HDU-4109 题目大意 有 N 个指令&#xff0c;标号从 0 ~ N - 1&#xff0c;和 M 个指令间的先后关系&#xff0c;每个关系都有一个权值 w&#xff0c;表示后一个指令在前一个指令开始时间之后 w 纳秒才开始执行。现在要并发执行…

养成一个习惯需要多久?

有人说养成一个习惯需要21天&#xff0c;有人说30天……养成习惯到底需要多少天&#xff1f; _hzw 2012-11-09 18:04又快到年末了。 年初时&#xff0c;你曾许诺要养成一些好习惯&#xff0c;比如要常运动、多读书、少微博。有人说说养成一个习惯只需要坚持21天&#xff1b;21天…

vue3 eslint The template root requires exactly one element问题

vue项目中手动引入eslint npm install eslint --save-dev eslint初始化 npx eslint --init 运行时npm run lint 简单语法问题--fix会自动修复 但是vue3项目出现只能有一个根节点的问题 原因在于 eslintrc.js里extends中plugin:vue/essential的问题 看eslint-plugin-vue官网…

你所知道的学习方法,都是错的!

你所知道的学习方法&#xff0c;都是错的&#xff01; 上课的时候记笔记&#xff1f;哪门功课不行&#xff0c;就集中精力专项突击&#xff1f;自习的时候不要晃&#xff0c;选好一个地儿安安稳稳地待那儿学习&#xff1f;你还在这样学习吗&#xff1f;不要被骗了&#xff1a;这…

Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架&#xff0c;通过服务的小型化、原子化以及分布式架构的弹性伸缩和高可用性&#xff0c;可以实现业务之间的松耦合、业务的灵活调整组合以及系统的高可用性…

亚伦•斯沃茨:提升时间的品质

亚伦•斯沃茨&#xff1a;提升时间的品质 不休不眠地工作是低效的&#xff0c;怎样发挥时间的最大效率&#xff1f; 伏维阁主 2013-01-18 16:45图片来源&#xff1a;personalitytutor.com &#xff08;亚伦•斯沃茨Aaron Swartz / 文&#xff09;《 怎样有效利用时间 》中给出的…

Flex4_HttpService组件

1、在JavaWeb项目中新建Servlet(FlexLoginServelt) &#xff1a; public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setContentType("text…

想要提高记忆力?做梦去吧!

想要提高记忆力&#xff1f;做梦去吧&#xff01; 豆豆助 2010-11-26 11:47经验说&#xff1a;不好好学习&#xff0c;就知道睡觉 实验说&#xff1a;要想记忆好&#xff0c;睡觉不能少。做梦可以增强我们的记忆。 有没有办法能让人不费吹灰之力增强记忆力&#xff1f; 做梦吧你…

This beta version of Typora is expired, please download and install a newer version. 解决方案

原文链接&#xff1a;https://blog.csdn.net/yyywxk/article/details/125133205 问题描述 今日打开 Typora 软件时&#xff0c;突然报错&#xff0c;提示软件版本已过期&#xff0c;需要安装新版本&#xff0c;如下图所示。 关闭错误提示框后会自动跳转到&#xff1a;https://…