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 相关文章推荐
python中将阿拉伯数字转换成中文的实现代码
May 19 Python
浅谈python新手中常见的疑惑及解答
Jun 14 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
详解Django之auth模块(用户认证)
Apr 17 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
Python异常处理例题整理
Jul 07 Python
Python文本处理简单易懂方法解析
Dec 19 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
用60行代码实现Python自动抢微信红包
Feb 04 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
一个PHP+MSSQL分页的例子
2006/10/09 PHP
PHP Session机制简介及用法
2014/08/19 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
Javascript的this详解
2019/03/23 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
Python 第一步 hello world
2009/09/25 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
python简单商城购物车实例代码
2018/03/15 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
python的等深分箱实例
2019/11/22 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
html5.2 dialog简介详解
2018/02/27 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
采购员岗位职责
2013/11/15 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
老公保证书怎么写
2015/02/26 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript