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通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Python中的匿名函数使用简介
Apr 27 Python
python妙用之编码的转换详解
Apr 21 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
Python2与Python3的区别实例总结
Apr 17 Python
linux环境中没有网络怎么下载python
Jul 07 Python
django-初始配置(纯手写)详解
Jul 30 Python
Mac安装python3的方法步骤
Aug 09 Python
python 矢量数据转栅格数据代码实例
Sep 30 Python
Python遍历字典方式就实例详解
Dec 28 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 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
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
【消息提示组件】,兼容IE6/7&&FF2
2007/09/04 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
Python中下划线的使用方法
2015/03/27 Python
python实现给数组按片赋值的方法
2015/07/28 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
详解Python 切片语法
2019/06/10 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
雷蛇美国官网:Razer
2020/04/03 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
教师节随笔
2015/08/15 职场文书
环保建议书作文500字
2015/09/14 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang