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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
python执行外部程序的常用方法小结
Mar 21 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
Python常用算法学习基础教程
Apr 13 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
Python3中exp()函数用法分析
Feb 19 Python
Python文件读写常见用法总结
Feb 22 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
python实现低通滤波器代码
Feb 26 Python
pycharm设置python文件模板信息过程图解
Mar 10 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中Collection 类的设计
2013/06/21 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python远程连接MySQL数据库
2019/04/19 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
python3中eval函数用法使用简介
2019/08/02 Python
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
工程部主管岗位职责
2015/02/12 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
男人帮观后感
2015/06/18 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
Python实现抖音热搜定时爬取功能
2022/03/16 Python
Java实现注册登录跳转
2022/06/16 Java/Android