Python3.5面向对象程序设计之类的继承和多态详解


Posted in Python onApril 24, 2019

本文实例讲述了Python3.5面向对象程序设计之类的继承和多态。分享给大家供大家参考,具体如下:

1、继承的定义

继承是指:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
(1)通过继承创建的新类称为“子类”或“派生类”。
(2)被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

2、继承的分类

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

(1) 实现继承是指使用基类的属性和方法而无需额外编码的能力;
  (2)接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构父类方法);
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。
抽象类仅定义将由子类创建的一般属性和方法。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

3、示例代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#类的继承
class People:
 def __init__(self,name,age):
  self.name = name
  self.age = age

 def eat(self):
  print("%s is eating..." %self.name)

 def sleep(self):
  print("%s is sleeping..." %self.name)

 def talk(self):
  print("%s is talking..." %self.name)

class Man(People):  #继承父类People类
 def make_money(self):
  print("%s is making money..." %self.name)

 def sleep(self):
  People.sleep(self)  #对父类方法的扩展
  print("man is sleeping...")

class Women(People):
 def shop(self):
  print("%s is shopping..." %self.name)

m1 = Man("Jack","20")
m1.eat()
m1.make_money()
m1.sleep()

w1 = Women("Amy","25")
w1.talk()
w1.shop()

运行结果:

Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...

4、子类中对父类的构造函数进行重构两种方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#类的继承
#class People:  #经典类
class People(object):  #新式类
 def __init__(self,name,age):
  self.name = name
  self.age = age

 def eat(self):
  print("%s is eating..." %self.name)

 def sleep(self):
  print("%s is sleeping..." %self.name)

 def talk(self):
  print("%s is talking..." %self.name)

class Man(People):  #继承父类People类
 def __init__(self,name,age,money):
  #People.__init__(self,name,age)  #(方法一)对构造函数进行重构、添加父类中没有的属性
  super(Man,self).__init__(name,age) #(方法二)利用super对构造函数进行重构(新式类写法)
  self.money = money
  print("%s have money %s$" %(self.name,self.money))

 def make_money(self):
  print("%s is making money..." %self.name)

 def sleep(self):
  People.sleep(self)  #对父类方法的扩展
  print("man is sleeping...")

class Women(People):
 def shop(self):
  print("%s is shopping..." %self.name)

m1 = Man("Jack","20",10)
m1.eat()
m1.make_money()
m1.sleep()

w1 = Women("Amy","25")
w1.talk()
w1.shop()

运行结果:

J ack have money 10$
Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...

5、多继承方式

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#类的继承
#class People:  #经典类
class People(object):  #新式类
 def __init__(self,name,age):
  self.name = name
  self.age = age
  self.friends = []

 def eat(self):
  print("%s is eating..." %self.name)

 def sleep(self):
  print("%s is sleeping..." %self.name)

 def talk(self):
  print("%s is talking..." %self.name)

class Relationship(object):
 def make_friends(self,obj):
  print("%s is making friends with %s" %(self.name,obj.name))
  self.friends.append(obj)

class Man(People,Relationship):  #多继承
 def __init__(self,name,age,money):
  #People.__init__(self,name,age)  #(方法一)对构造函数进行重构、添加父类中没有的属性
  super(Man,self).__init__(name,age) #(方法二)利用super对构造函数进行重构(新式类写法)
  self.money = money
  print("%s have money %s$" %(self.name,self.money))

 def make_money(self):
  print("%s is making money..." %self.name)

 def sleep(self):
  People.sleep(self)  #对父类方法的扩展
  print("man is sleeping...")

class Women(People,Relationship): #多继承
 def shop(self):
  print("%s is shopping..." %self.name)

m1 = Man("Jack","20",10)

w1 = Women("Amy","25")

m1.make_friends(w1)
w1.name = "liu"
print(m1.friends)

运行结果:

Jack have money 10$
Jack is making friends with Amy
[<__main__.Women object at 0x0057FA30>]

6、新式类与经典类的继承顺序

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

class A(object):		#新式类
 def __init__(self):
  print("A")

class B(A):
 def __init__(self):
  
  print("B")

class C(A):
 def __init__(self):
  print("C")

class D(B,C):
 def __init__(self):
  pass
  #print("D")

obj = D()

Python3.5面向对象程序设计之类的继承和多态详解

Python3.5面向对象程序设计之类的继承和多态详解

7、继承示例——学校、教师与学生

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#继承实例(新式类)——模拟学校、教师与学生

class School(object):
 def __init__(self,name,addr):
  self.name = name
  self.addr = addr
  self.students = []
  self.stuffs = []

 def enroll(self,stu_obj):  #学生注册
  print("%s 学员办理注册" %stu_obj.name)
  self.students.append(stu_obj)

 def heir(self,staff_obj):  #聘请教师
  print("聘请教师 %s" %staff_obj.name)
  self.stuffs.append(staff_obj)

class SchoolMember(object):
 def __init__(self,name,age,sex):
  self.name = name
  self.age = age
  self.sex = sex

 def tell(self):
  pass

class Teacher(SchoolMember):
 def __init__(self,name,age,sex,salary,course):
  super(Teacher,self).__init__(name,age,sex)
  self.salary = salary
  self.course = course

 def tell(self):
  print('''
  ----- info of Teacher:%s -----
  Name:%s
  Age:%s
  Sex:%s
  Salary:%s
  Course:%s
  '''%(self.name,self.name,self.age,self.sex,self.salary,self.course))

 def teach(self):
  print("%s is teaching course [%s]" %(self.name,self.course))

class Student(SchoolMember):
 def __init__(self,name,age,sex,stu_id,grade):
  super(Student,self).__init__(name,age,sex)
  self.stu_id = stu_id
  self.grade = grade

 def tell(self):
  print('''
  ----- info of Student:%s -----
  Name:%s
  Age:%s
  Sex:%s
  Stu_id:%s
  Grade:%s
  '''%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade))

 def pay_tuition(self,amount):
  print("%s has paied tuition for $%s" %(self.name,amount))

#实例化
school = School("qinghua","beijing")

t1 = Teacher("Jack","30","M","20000","Python")
t2 = Teacher("Amy","28","F","15000","Linux")

s1 = Student("liu","23","M","1701","Python")
s2 = Student("wang","25","F","1702","Linux")

#调用显示学生与教师的信息
t1.tell()
s1.tell()

school.heir(t1)  #聘请教师t1
school.enroll(s1) #学生s1注册
school.enroll(s2)

print(school.stuffs)
print(school.students)

#聘请的第一位教师教课
school.stuffs[0].teach()
for stu in school.students:
 stu.pay_tuition(5000)

运行结果:

        ----- info of Teacher:Jack -----
        Name:Jack
        Age:30
        Sex:M
        Salary:20000
        Course:Python
       
 
        ----- info of Student:liu -----
        Name:liu
        Age:23
        Sex:M
        Stu_id:1701
        Grade:Python
       
聘请教师 Jack
liu 学员办理注册
wang 学员办理注册
[<__main__.Teacher object at 0x0059FDB0>]
[<__main__.Student object at 0x0059FDF0>, <__main__.Student object at 0x0059FE10>]
Jack is teaching course [Python]
liu has paied tuition for $5000
wang has paied tuition for $5000

8、多态(polymorphisn)——一种接口,多种形态

(1)定义

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,

赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

多态的作用:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。

而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

Pyhon 很多语法都是支持多态的,比如 len(),sorted(), 你给len传字符串就返回字符串的长度,传列表就返回列表长度。

(2)示例代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

class Animal(object):
 def __init__(self,name):
  self.name = name

 def talk(self):
  raise NotImplementedError("Subclass must implement abstract method")

 # 多态——一种接口,多种形态
 @staticmethod
 def animal_talk(obj):
  obj.talk()

class Cat(Animal):
 def talk(self):
  print("%s Meow!" %self.name)

class Dog(Animal):
 def talk(self):
  print("%s Woof! Woof!" % self.name)

d = Dog("A")
#d.talk()

c = Cat("B")
#c.talk()

#多态
Animal.animal_talk(d)
Animal.animal_talk(c)

运行结果:

A Woof! Woof!
B Meow!

9、面向对象设计利器——领域建模

(1)定义

从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向 对象设计的一座桥梁。 
领域模型,顾名思义,就是需求所涉及的领域的一个建模,更通俗的讲法是业务模型。

(2)领域模型有两个主要的作用:
发掘重要的业务领域概念
建立业务领域概念之间的关系 

 (3)领域建模三字经 
领域模型如此重要,领域建模的方法概括一下就是“找名词”! 即使是简单的找名词这样的操作,也涉及到分析和提炼,而 不是简单的摘取出来就可,

这种情况下分析师和设计师的经验和技能就能够派上用场了。但领域模型分析 也确实相对简单,即使没有丰富的经验和高超的技巧,至少也能完成一个能用的领域模型。

一个关键的问题:从哪里找? 因为领域模型是“需求到面向对象的桥梁”,能想到:从需求模型中找,具体来说就是从用例中找。 

归纳:领域建模的方法就是“从用例中找名词”。 当然,找到名词后,为了能够更加符合面向对象的要求和特点。

我们还需要对这些名词进一步完善,这就 是接下来的步骤:加属性,连关系!

最后我们总结出领域建模的三字经方法:找名词、加属性、连关系。 

Python3.5面向对象程序设计之类的继承和多态详解Python3.5面向对象程序设计之类的继承和多态详解
Python3.5面向对象程序设计之类的继承和多态详解

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

Python 相关文章推荐
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python制作Windows系统服务
Mar 25 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
利用python实现AR教程
Nov 20 Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 Python
python怎么提高计算速度
Jun 11 Python
Python中qutip用法示例详解
Oct 02 Python
Python supervisor强大的进程管理工具的使用
Apr 24 #Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 #Python
Python3.5面向对象编程图文与实例详解
Apr 24 #Python
Python对ElasticSearch获取数据及操作
Apr 24 #Python
Python3.5面向对象与继承图文实例详解
Apr 24 #Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 #Python
基于python的ini配置文件操作工具类
Apr 24 #Python
You might like
PHP 命令行参数详解及应用
2011/05/18 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
javascript 函数使用说明
2010/04/07 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
jQuery validate 验证radio实例
2017/03/01 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
React组件refs的使用详解
2018/02/09 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Django REST framework 分页的实现代码
2019/06/19 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
竞选学生会演讲稿
2014/04/25 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
外贸业务员求职信
2014/06/16 职场文书
贷款工资证明范本
2015/06/12 职场文书
干部考核工作总结
2015/08/12 职场文书
《认识钟表》教学反思
2016/02/16 职场文书