Python类的继承、多态及获取对象信息操作详解


Posted in Python onFebruary 28, 2019

本文实例讲述了Python类的继承、多态及获取对象信息操作。分享给大家供大家参考,具体如下:

继承

类的继承机制使得子类可以继承父类中定义的方法,拥有父类的财产,比如有一个Animal的类作为父类,它有一个eat方法:

class Animal(object):
  def __init__(self):
    print("Animal 构造函数调用!")
  def eat(self):
    print("Animal is eatting!")

写两个子类,Cat和Dog类,继承自Animal类,声明方法是在定义子类的时候在子类的括号内写上父类Animal:

class Animal(object):
  def __init__(self):
    print("Animal 构造函数调用!")
  def eat(self):
    print("Animal is eatting!")
class Cat(Animal):
  def __init__(self):
    print("Cat 构造函数调用!")
class Dog(Animal):
  def __init__(self,age):
    self.age=age
    print("Dog 构造函数调用!")

两个子类中并没有声明任何方法,但是会自动继承父类中的eat方法:

cat=Cat()
dog=Dog(3)
cat.eat()
dog.eat()

声明两个对象,调用eat方法,运行输出:

Cat 构造函数调用!
Dog 构造函数调用!
Animal is eatting!
Animal is eatting!

一般把一些共有的方法定义在基类中,其他继承自该基类的子类就可以自动拥有这个方法。

多态

在继承的基础上,就引入了类的另外一个重要的特性——多态。

考虑一个问题,子类可以继承父类的方法,那子类是否可以实现自己的这个方法呢,答案是可以的。

class Animal(object):
  def __init__(self):
    print("Animal 构造函数调用!")
  def eat(self):
    print("Animal is eatting!")
class Cat(Animal):
  def __init__(self):
    print("Cat 构造函数调用!")
  def eat(self):
    print("Cat is eatting!")
class Dog(Animal):
  def __init__(self,age):
    self.age=age
    print("Dog 构造函数调用!")
  def eat(self):
    print("年龄是"+str(self.age)+"岁的Dog is eatting!")
cat =Cat()
cat.eat()
dog=Dog(3)
dog.eat()

子类如果也定义了自己的实现,就会优先调用自己的实现,上边cat和dog调用eat方法就分别是自己的实现,运行输出:

Cat 构造函数调用!
Cat is eatting!
Dog 构造函数调用!
年龄是3岁的Dog is eatting!

多态意味着一个接口,多种实现,另一个可以体现类的多态这种特性的例子:

def eat(animal):
  if hasattr(animal,'eat'):
    animal.eat()
  if hasattr(animal,'age'):
    a=getattr(animal,'age')
    print('animal的年龄是'+str(a)+'岁')
eat(dog)

这里定义了一个普通函数eat,函数的入参是类的对象,具体实现是调用传入的对象的eat方法,传入不同的对象,就有不同的输出,调用的时候只要调用这个接口就可以了,而不用管具体的细节。

运行输出:

年龄是3岁的Dog is eatting!
animal的年龄是3岁

获取对象信息

hasattr(object , 'name')

说明:判断对象object是否包含名为name的属性或方法,如果有则返回True,没有则返回False

getattr( object, 'name')

说明:获取对象object中名称为name的属性,返回name的值。

对类中方法的调用,可以先用hasattr判断是否存在该方法,然后再调用这个方法,避免异常:

class Animal(object):
  def __init__(self):
    print("Animal 构造函数调用!")
  def eat(self):
    print("Animal is eatting!")
def eat(animal):
  if hasattr(animal,'eat'):
    animal.eat()
  if hasattr(animal,'age'):
    a=getattr(animal,'age')
    print('animal的年龄是'+str(a)+'岁')
  if hasattr(animal, 'sleep'):
    animal.sleep()
  else:
    print('animal类中不含有sleep方法!')
animal=Animal()
eat(animal)

运行输出:

Animal 构造函数调用!
Animal is eatting!
animal类中不含有sleep方法!

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

Python 相关文章推荐
django使用图片延时加载引起后台404错误
Apr 18 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
Python下简易的单例模式详解
Apr 08 Python
分享PyCharm的几个使用技巧
Nov 10 Python
python matplotlib拟合直线的实现
Nov 19 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
python 8种必备的gui库
Aug 27 Python
Python实现快速大文件比较代码解析
Sep 04 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
django模板结构优化的方法
Feb 28 #Python
详解python做UI界面的方法
Feb 27 #Python
总结python中pass的作用
Feb 27 #Python
Python递归函数实例讲解
Feb 27 #Python
PyQt打开保存对话框的方法和使用详解
Feb 27 #Python
python中嵌套函数的实操步骤
Feb 27 #Python
python把1变成01的步骤总结
Feb 27 #Python
You might like
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python实现自动访问网页的例子
2020/02/21 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
高级Java程序员面试要点
2013/08/02 面试题
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
jQuery treeview树形结构应用
2021/03/24 jQuery
三年级数学教学反思
2014/01/31 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
大学生村官入党自传
2015/06/26 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
医院保洁员管理制度
2015/08/05 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
python中opencv实现图片文本倾斜校正
2021/06/11 Python
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL