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类的继承和多态
现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就不知道了.之前学C++的时候就把类.对象这块弄得乱七八糟,现在是因为很想玩python,所以就看看python的类和对象. 就像说的,类有三个 ...
- Python面向对象 -- 继承和多态、获取对象信息、实例属性和类属性
继承和多态 继承的好处: 1,子类可以使用父类的全部功能 2,多态:当子类和父类都存在相同的方法时,子类的方法会覆盖父类的方法,即调用时会调用子类的方法.这就是继承的另一个好处:多态. 多态: 调用方 ...
- 【Python】[面性对象编程] 获取对象信息,实例属性和类属性
获取对象信息1.使用isinstance()判断class类型2.dir() 返回一个对象的所有属性和方法3.如果试图获取不存在的对象会抛出异常[AttributeError]4.正确利用对象内置函数 ...
- Python类的继承(进阶5)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411918.html 本文出自:[Edwin博客园] Python类的继承(进阶5) 1. python中什 ...
- python 面向对象编程、获取对象信息
面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...
- python基础——获取对象信息
python基础——获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type( ...
- python 获取对象信息
当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python3类和实例之获取对象信息
当我们拿到一个对象的引用时,如何知道这个对象是什么类型,有哪些方法呢 使用type() 判断对象类型使用type()函数 基本类型都可以用type()判断 <class 'int'> &g ...
随机推荐
- [Offer收割]编程练习赛38
漏写的数字 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #inclu ...
- Python matplotlib库
安装日期:2017.9.7 版本不太清楚,为啥嘞? 从python2到python3,还有在学的tensorflow,版本一更新就会有之前的代码不能用了.学习的时候用别人的代码各种出错,查了半天发现那 ...
- JAVA基本数据类型转换的注意事项
JAVA中基本数据类型: 类型: 字节: 范围: 默认值: byte 1 -128~127 0 short 2 -32768~32767 0 char 2 0~65535 '\u0000' int 4 ...
- RAID5存储上parted进行分期及UUID对应关系
#parted [设备] [命令 [参数]]命令功能: 新增分区:mkpart [primary|logical|extended] [ext3|vfat] 开始 结束 分区表:print 删除分区: ...
- C# 递归产生树
//递归产生树 private void CreateTwo(TreeNode node, int id) { #region --根据指定ID查找数据到 dt string strSql = &qu ...
- Robot Framework(四)创建测试套件
2.3.1测试用例文件 Robot Framework测试用例是使用测试用例文件中的测试用例表创建的.这样的文件会自动从它包含的所有测试用例中创建一个测试套件.可以有多少测试用例没有上限,但建议少于1 ...
- PhotoZoom控制面板简介说明
PhotoZoom是一款极其简单的图片无损放大工具,简单几步渲染出完美的放大照片,呈现无与伦比的画质效果.即可虽然简单,菜单和面板的功能很少,但却是设计师的必备神器,因为其简单易用性,它的软件菜单命令 ...
- Js判断一个字符串是否包含一个子串
Js中经常遇到判断一个字符串是否包含一个子串,java语言中有containes的方法,直接调用就可以了.除非引用第三方数据库,Js中没有contains方法. 为了实现更java语言中contain ...
- WPF 创建用户控件并引用
项目源码地址:https://github.com/lizhiqiang0204/WpfControlLibrary.git 首先创建新项目->WPF用户控件库项目 在UserControl1. ...
- URLLib库使用
Date: 2019-06-19 Author: Sun urllib 在Python 3以后的版本中,urllib2这个模块已经不单独存在(也就是说当你import urllib2时,系统提示你 ...