继承

之前我们说到了类的公有属性和类的私有属性,其实就是类的封装,现在准备随笔的 是继承,是面向对象的第二大特性。

  面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

  通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

  继承概念的实现方式主要有2类:实现继承、接口继承。

  1. 实现继承是指使用基类的属性和方法而无需额外编码的能力。
  2. 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)。

  在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

  抽象类仅定义将由子类创建的一般属性和方法,OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段

二、类的继承

1、继承的定义

在类名的括号中写入需要继承的类名即可

class Person(object):def talk(self):print("person is talking...")class BlackPerson(Person):  #继承Person这个类def walk(self):  #定义子类自身的walk方法print("BlackPerson is walking.....")b = BlackPerson()
b.talk()   #由于继承了父类的talk()方法,所以可以被调用
b.walk()  #调用子类自身的walk方法#输出
person is talking...
BlackPerson is walking.....

2、构造方法的继承

 说明:因为子类有自己的属性,但是又想继承父类的属性,所以需要先继承,再重构

继承类的构造方法2种写法:

  1. 经典类写法:父类.__init(self,name,age)
  2. 新式类写法:super(子类,self).__init__(name,age)

更多经典类和新式类知识补充:点击

注:建议使用新式类的写法,因为使用经典类的写法,在多继承的情况下,会出现重复调用参数的可能

class Person(object):def __init__(self,name,age):self.name = nameself.age = ageself.sex = "noraml"def talk(self):print("person is talking...")class BlackPerson(Person):def __init__(self,name,age,strength):  #定义时需要传入父类的属性名Person.__init__(self,name,age)  #继承父类的构造方法,也可以写成:super(BlackPerson,self).__init__(name,age)self.strength = strength   #定义子类本身的属性print(self.name,self.age,self.sex)def walk(self):print("BlackPerson is walking.....")b = BlackPerson("xiaogao",18,"strong")#输出
xiaogao 18 noraml

这边不禁的有一个疑问?我不能重新写一遍,我为啥要继承父类中的方法呢?因为你重新写一遍的话,只能继承self.name和self.age,那self.sex怎么办,它也需要重写吗?所以啊,只有把父类中的构造函数全部继承过来,只能用上面这种办法?那它是怎么实现的呢?我们来画一个图:

3、子类对父类方法的重写

说明:如果我对父类中的方法不满意,我可以重写父类中的方法,当然还可以继承父类中的方法

class Person(object):def __init__(self,name,age):self.name = nameself.age = ageself.sex = "noraml"def talk(self):print("person is talking...")class BlackPerson(Person):def talk(self):  #重写父类的方法Person.talk(self)  #调用父类的方法print("BlackPerson is talking ...")def walk(self):print("BlackPerson is walking.....")b = BlackPerson("xiaogao",18)  #子类不写,则继承父类的构造方法
b.talk()
b.walk()#输出
person is talking...
BlackPerson is talking ...
BlackPerson is walking.....

其实重写不是上面说的那么简单,只需要子类的方法名和父类的中的方法名一样就算重写了,其实不然,那怎么样才算重写呢?

重写的条件:

  1. 重写方法的方法名必须和父类中被重写的方法名一模一样
  2. 重写方法的传入的参数名和参数的个数必须和父类中被重写的方法一样

我们再来看看下面的例子:

class Person(object):def talk(self,food):print("person is talking...{0}".format(food))class BlackPerson(Person):def talk(self):  #方法名和父类的方法名一样,但是少了一个food参数print("BlackPerson is talking ...")b = BlackPerson("xiaogao",18,"strong")
b.talk()#输出
BlackPerson is talking ...

看着像重写了呀!其实不是重写,根据重写的条件明显两个方法的传入参数名和参数的个数都不一样,其实上面这种只是子类自己写了一个talk方法,只是名字一样,但是传入的参数和参数的个数不一样,并不是重写了父类中的方法。下面这个才是真正的重写:

class Person(object):def talk(self,food):print("person is talking...{0}".format(food))class BlackPerson(Person):def talk(self,food):  #重写父类的方法(方法名和传入的参数名以及参数的个数与父类的方法一样)print("BlackPerson is talking ...{0}".format(food))b = BlackPerson("xiaogao",18,"strong")
b.talk("hotdog")#输出
BlackPerson is talking ...hotdog

类继承练习的小例子:

class SchoolMember(object):'''学校成员基类'''member = 0  #设置类属性def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex =sexself.enroll()  #每次生成一个对象注册一次def enroll(self):"注册"print("just enroll a new school member [{0}]".format(self.name))SchoolMember.member += 1def tell(self):print("------info:{0}-----".format(self.name))for k,v in self.__dict__.items():  #__dict__()函数是获取对象的属性,以字典的形式返回print("\t",k,v)print("------end--------")def __del__(self):print("开除了[{0}]...".format(self.name))SchoolMember.member -= 1class Teacher(SchoolMember):"讲师类"def __init__(self,name,age,sex,salary,course):SchoolMember.__init__(self,name,age,sex)self.salary = salaryself.course = coursedef teaching(self):"讲课方法"print("Teacher [{0}] is teaching [{1}]".format(self.name,self.course))class Student(SchoolMember):"学生类"def __init__(self,name,age,sex,couser,tuition):SchoolMember.__init__(self,name,age,sex)self.couser = couserself.tuition = tuitionself.amount = 0def pay_tuition(self,amount):print("student [{0}] has just paied [{1}]".format(self.name,amount))self.amount += amountt1 = Teacher("xiaogao",18,"F*M",3000,"Python")
s1 = Student("shuaigao",19,"M","PYS15",300000)
s2 = Student("gaogao",12,"M","PYS15",11000)print(SchoolMember.member)
del s1  #删除一个变量
t1.tell()
s2.tell()
print(SchoolMember.member) #会执行__del__函数#输出
just enroll a new school member [xiaogao]
just enroll a new school member [shuaigao]
just enroll a new school member [gaogao]
3
开除了[shuaigao]...
------info:xiaogao-----salary 3000sex F*Mcourse Pythonname xiaogaoage 18
------end--------
------info:gaogao-----couser PYS15sex Mname gaogaoamount 0tuition 11000age 12
------end--------
2
开除了[gaogao]...
开除了[xiaogao]...

View Code

多态

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
很遗憾,在python不能直接的支持多态,所以我们只能间接的去执行
class Animal:def __init__(self,name):self.name = namedef talk(self):print("animal {0} is talk".format(self.name))class Cat(Animal):def talk(self):return "Meow!"class Dog(Animal):def talk(self):return "Woof!Woof!"def animal_talk(obj):    #定义一个调用类的talk方法print(obj.talk())all_animal = [Dog("d1"),Cat("c1")]  #把对象存入列表中for animal in all_animal:  #循环传入对象animal_talk(animal)  # 实现类似于Animal.talk(Dog("d1"))这种效果#输出
Woof!Woof!
Meow!

小结:

  1. 多态在python中是不支持的
  2. 想要在python实现类似于Animal.talk(Dog("d1")),可以定义一个可以类方法的一个方法,调用时需要往这个方法传入类的实例

转载于:https://www.cnblogs.com/Keep-Ambition/p/7290608.html

【python】-- 类的继承(新式类/经典类)、多态相关推荐

  1. python中的继承有什么特点_python类的继承是什么?类的继承有什么样的规则?

    在这篇文章之中我们来了解一下python类的继承,对于刚刚接触到python这一编程语言的朋友来说,对于python类的继承的了解应该比较少,不过没关系,在接下来的文章之中我们就来了解一下python ...

  2. python类的继承super方法_Python类的继承super相关原理解析

    看了网上许多关于super.mro.C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多.我将网上这些博主的文章进行一个梳理总结,最 ...

  3. python自定义异常类一般继承于_自定义异常类一般继承自_______或其子类。

    [填空题]Python语句print('%d%%%d'%(3/2, 3%2))的运行结果是( 1 ). [填空题]自定义异常类一般继承自_______或其子类. [填空题]Python语句" ...

  4. 类的继承和派生java_python 类的继承和派生

    面向对象的编程带来的主要好处之一是代码的复用,实现这种复用的方法之一是通过继承机制. python中解决代码复用的方式:继承和组合. 1 什么是继承 继承是一种创建类的方法,在python中,一个类可 ...

  5. java实验33 类的继承2_java实验2 类的继承性

    实验2 类的继承性 一.实验目的 掌握面向对象的继承性在Java中的实现方法:掌握super关键字的用法,体会抽象类和抽象方法的作用. 二.实验内容 1.程序理解: 1)类的继承 2)第4章课后编程第 ...

  6. 类的继承和派生java_类的继承和派生

    一.类的继承和派生定义. 继承:保持已有类的特性而构造新类的过程称为继承. 派生:在已有类的基础上新增自己的特性而产生新类的过程称为派生. 被继承的已有类称为基类. 派生出的新类称为派生类. 二.继承 ...

  7. java 什么是类的继承_Java基础,类的继承,粗略的理解希望对大家有所帮助!

    Java基础:继承 读者老爷们大家好,今天图图带大家了解一下java基础里的继承. 首先确定一下我们今天的学习的三个目标.第一个是类的继承:第二个是访问控制权限:第三个方法重写(覆盖)override ...

  8. 类的继承定义一个computer类在此基础上派生出两个子类(继承与多态绑定)

    题目如下 定义一个计算机类(Computer),并在它的基础上派生出两个子类:台上机(Desktop)和便携机类(Notebook),在Computer中定义几个方法,并在子类Desktop和Note ...

  9. 类的继承和派生java_Java 类的继承与派生

    派生类一般格式: [类的修饰符] class 子类名 extends 父类名{ 成员变量定义 成员方法定义 } public class AutoMobileTest { public static ...

  10. Python经典类与新式类已经经典继承和新式继承;以及继承顺序

    经典类和新式类,以及经典继承和新式继承 # class Animal: #经典类 class Animal(object): #新式类def __init__(self,name):self.name ...

最新文章

  1. 【Vue】新建一个Vue3项目
  2. centOS外部浏览器无法访问tomcat8000端口解决办法
  3. 如何搭建一个完整的手机直播系统源码?
  4. 关键词匹配(Ac自动机模板题)
  5. 九九乘法表c语言编程伪代码,py_11分支和循环
  6. Sequence Sorting CodeForces - 1223D(思维)
  7. 【PAT - 甲级1007】Maximum Subsequence Sum (25分)(前缀和)
  8. JAVA入门级教学之(char类型)
  9. 基于MFC框架下OpenGL的exe可移植
  10. c语言 fread读指定字节,fread函数 c语言中fread函数怎么用
  11. 网站打不开如何解决?教你4个方法搞定它!
  12. Windows 命令行基础
  13. 第八章:Junit——selenium IED 的版本和 火狐浏览器的版本 相对应
  14. 图形学笔记(二十)粒子、刚体、流体的模拟—— 欧拉方法、Errors 和 Instability、中点法、自适应步长、隐式欧拉方法、Runge-Kutta方法、刚体与流体模拟(质点法、网格法、MPM)
  15. android 如何让应用程序在全部应用程序列表里显示跟隐藏!
  16. 同源策略的限制,没有同源策略会怎么样?
  17. [Plant Simulation]使用Battery的Transporter(Battery参数的使用以及小车状态统计)
  18. 励志:98岁老爷爷用Windows系统自带画图软件制作的神作
  19. SSH 端口转发多级端口转发
  20. 阿里如何实现高性能分布式强一致的独立 Paxos 基础库?

热门文章

  1. 蓝桥杯 BEGIN-1 入门训练 A+B问题
  2. LeetCode 58. Length of Last Word
  3. hadoop yarn 获取日志_Hadoop YARN日志查看方式
  4. python怎么在图片上写字_Python在图片中添加文字的两种方法
  5. Linux中,shell脚本调用java程序模板
  6. java 程序在Eclipse 或者 Linux 运行报 Unsupported major.minor version 51.0解决办法
  7. [Android] AsyncTask详解
  8. Android 版权介绍
  9. FCKEditor 验证为空需要点击两次提交按钮的问题
  10. [交互设计工具/原型创作工具]Axure RP Pro 5.0新特性 破解版 注册码