Python面向对象类的继承实例详解


Posted in Python onJune 27, 2018

本文实例讲述了Python面向对象类的继承。分享给大家供大家参考,具体如下:

一、概述

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

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

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

实现继承是指使用基类的属性和方法而无需额外编码的能力。

接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)。

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

OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

二、类的继承

2.1 继承的定义

class Person(object):  # 定义一个父类
  def talk(self):  # 父类中的方法
    print("person is talking....")
class Chinese(Person):  # 定义一个子类, 继承Person类
  def walk(self):   # 在子类中定义其自身的方法
    print('is walking...')
c = Chinese()
c.talk()   # 调用继承的Person类的方法
c.walk()   # 调用本身的方法

输出:

person is talking....
is walking...

2.2 构造函数的继承

如果我们要给实例 c 传参,我们就要使用到构造函数,那么构造函数该如何继承,同时子类中又如何定义自己的属性?

继承类的构造方法:

1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)

2. 新式类的写法:super(子类,self).__init__(参数1,参数2,....)

class Person(object):
  def __init__(self, name, age):
    self.name = name
    self.age = age
    self.weight = 'weight'
  def talk(self):
    print("person is talking....")
class Chinese(Person):
  def __init__(self, name, age, language): # 先继承,在重构
    Person.__init__(self, name, age) #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)
    self.language = language  # 定义类的本身属性
  def walk(self):
    print('is walking...')
class American(Person):
  pass
c = Chinese('bigberg', 22, 'Chinese')

如果我们只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。

子类构造函数基础父类构造函数过程如下:

实例化对象c ----> c 调用子类__init__()  ---- > 子类__init__()继承父类__init__()  ----- > 调用父类 __init__()

2.3 子类对父类方法的重写

如果我们对基类/父类的方法需要修改,可以在子类中重构该方法。如下的talk()方法

class Person(object):
  def __init__(self, name, age):
    self.name = name
    self.age = age
    self.weight = 'weight'
  def talk(self):
    print("person is talking....")
class Chinese(Person):
  def __init__(self, name, age, language):
    Person.__init__(self, name, age)
    self.language = language
    print(self.name, self.age, self.weight, self.language)
  def talk(self): # 子类 重构方法
    print('%s is speaking chinese' % self.name)
  def walk(self):
    print('is walking...')
c = Chinese('bigberg', 22, 'Chinese')
c.talk()

输出:

bigberg 22 weight Chinese
bigberg is speaking chinese

三、类继承的事例

class SchoolMember(object):
  '''学习成员基类'''
  member = 0
  def __init__(self, name, age, sex):
    self.name = name
    self.age = age
    self.sex = sex
    self.enroll()
  def enroll(self):
    '注册'
    print('just enrolled a new school member [%s].' % self.name)
    SchoolMember.member += 1
  def tell(self):
    print('----%s----' % self.name)
    for k, v in self.__dict__.items():
      print(k, v)
    print('----end-----')
  def __del__(self):
    print('开除了[%s]' % self.name)
    SchoolMember.member -= 1
class Teacher(SchoolMember):
  '教师'
  def __init__(self, name, age, sex, salary, course):
    SchoolMember.__init__(self, name, age, sex)
    self.salary = salary
    self.course = course
  def teaching(self):
    print('Teacher [%s] is teaching [%s]' % (self.name, self.course))
class Student(SchoolMember):
  '学生'
  def __init__(self, name, age, sex, course, tuition):
    SchoolMember.__init__(self, name, age, sex)
    self.course = course
    self.tuition = tuition
    self.amount = 0
  def pay_tuition(self, amount):
    print('student [%s] has just paied [%s]' % (self.name, amount))
    self.amount += amount
t1 = Teacher('Wusir', 28, 'M', 3000, 'python')
t1.tell()
s1 = Student('haitao', 38, 'M', 'python', 30000)
s1.tell()
s2 = Student('lichuang', 12, 'M', 'python', 11000)
print(SchoolMember.member)
del s2
print(SchoolMember.member)

输出:

----end-----
just enrolled a new school member [haitao].
----haitao----
age 38
sex M
name haitao
amount 0
course python
tuition 30000
----end-----
just enrolled a new school member [lichuang].
3
开除了[lichuang]
2
开除了[Wusir]
开除了[haitao]

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
初步理解Python进程的信号通讯
Apr 09 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
python写一个md5解密器示例
Feb 23 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
使用python3+xlrd解析Excel的实例
May 04 Python
Python中私有属性的定义方式
Mar 05 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 #Python
Python查找第n个子串的技巧分享
Jun 27 #Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 #Python
获取python的list中含有重复值的index方法
Jun 27 #Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 #Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 #Python
使用Python对微信好友进行数据分析
Jun 27 #Python
You might like
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
python输出pdf文档的实例
2020/02/13 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Python request使用方法及问题总结
2020/04/26 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
行政专员工作职责
2013/12/22 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
美术学专业求职信
2014/07/23 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
自主招生英文自荐信
2015/03/25 职场文书
行政上诉状范文
2015/05/23 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书