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版
Aug 12 Python
python基础教程项目二之画幅好画
Apr 02 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
Python中new方法的详解
Jan 15 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 Python
Pandas数据类型之category的用法
Jun 28 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文件上传实例详解!!!
2007/01/02 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php数组一对一替换实现代码
2012/08/31 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Python获取时间戳代码实例
2019/09/24 Python
Python类反射机制使用实例解析
2019/12/30 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
《小草和大树》教学反思
2014/02/16 职场文书
员工保密承诺书
2014/05/28 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
律师函格式范本
2015/05/27 职场文书
上甘岭观后感
2015/06/10 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
MySQL 逻辑备份 into outfile
2022/05/15 MySQL