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 ...
随机推荐
- mysql基础知识点梳理
##本单元目标 一.为什么要学习数据库 二.数据库的相关概念DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍MySQL产品的安装 ★MySQL服务的启动和停止 ...
- Vue-router记录
一.嵌套路由默认选中第一个子路由 可以给主路由加一个重定向的属性,把路径指向相应的子路由. { path: '/home', name: 'Home', //重定向 redirect: '/home/ ...
- BZOJ1060: [ZJOI2007]时态同步(树形dp 贪心)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3285 Solved: 1286[Submit][Status][Discuss] Descript ...
- Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法
1.理清概念 我们使用过Dialog和PopupWindow,还有Toast,它们都显示在Activity之上.那么我们首先需要理解的是android中是如何去绘制这些UI的呢?这里我只讲我所理解的, ...
- 读《我是一只 IT 小小鸟》
读<我是一只 IT 小小鸟> 作为一个一向看重节操的体面人,即使面临许多 DDL 包括期中考试,在忙乱不堪的时候我也断不断告诫自己,不能迫于课程要求仅为了写出一篇笔记而去读书,以后更是如此 ...
- Jetty容器配置https
Configuring the Jetty Container as a Https Connector Jetty版本:9.2.22.v20170606 Pom.xml <?xml versi ...
- CImage类的使用介绍!
链接参考:http://www.cnblogs.com/juncheng/articles/1600730.html CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG.GIF. ...
- spring的四种数据源配置
DriverManagerDataSource spring自带的数据源,配置如下: <bean id="dataSource" class="org.spr ...
- SQL增删改
USE sqlxx CREATE TABLE ygb( sid INT, sname VARCHAR(20), sgender VARCHAR(2), sbirthday DATE, semail V ...
- Nginx负载均衡health_check分析
在Nginx负载均衡中,我们很难保证说每一台应用服务器都能一直正常的运行下去.但是我们可以通过设置Nginx来检测这些应用服务器,检测这些服务器当中不能访问的. Nginx的检测方式分为两种,一种是被 ...