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验证码识别处理实例
Dec 28 Python
python实现决策树、随机森林的简单原理
Mar 26 Python
python中的常量和变量代码详解
Jul 25 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
python中eval与int的区别浅析
Aug 11 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
python SocketServer源码深入解读
Sep 17 Python
基于Tensorflow:CPU性能分析
Feb 10 Python
Python ini文件常用操作方法解析
Apr 26 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
PHP的基本常识小结
2013/07/05 PHP
php绘制一个矩形的方法
2015/01/24 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
javascript FormatNumber函数实现方法
2008/12/30 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
python实现简单温度转换的方法
2015/03/13 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python提取网页中超链接的方法
2016/09/18 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
python matplotlib库的基本使用
2020/09/23 Python
我的求职计划书
2014/01/10 职场文书
图书室标语
2014/06/21 职场文书
党员教师群众路线对照检查材料思想汇报
2014/09/29 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
Redis 限流器
2022/05/15 Redis