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 ...
随机推荐
- jar运行main函数的方法
当把java项目打包成jar后,如何运行main函数呢? 第一种:指定运行类: java -cp test.jar com.ming.test.Test 第二种:在MANIFEST.MF里配置了Mai ...
- DataTable转Dictionary
DataTable dt = new DataTable(); dt.Columns.Add("name"); dt.Columns.Add("no"); dt ...
- Javascript Proxy对象 简介
Javascript Proxy对象 简介 Javascript Proxy对象 改变你操作对象的方式 Proxies 是Javasript对象的中间件 ...或者说至少是那种很早的版本. ES6 中 ...
- 第八课: - 从Microsoft SQL数据库读取
第 8 课 如何从Microsoft SQL数据库中提取数据 In [1]: # Import libraries import pandas as pd import sys from sqlalc ...
- Spring学习笔记之基础、IOC、DI(1)
0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 application ...
- 以shareExtension为例学习iOS扩展开发
整体介绍 phone Extension 用法基础详解 share Extension 用法基础详解 demo链接 密码: i72z
- C# 遍历对象下的 属性
foreach (System.Reflection.PropertyInfo p in users.GetType().GetProperties()) { var xx = p.Name; var ...
- a rel=noopener
看vue-element-admin的源码的时候,看到a 标签使用 rel=noopener: 然后就很奇怪这个是干什么用的:然后百度到一篇文章,涨知识了. 个人的理解是:不加 rel=noopen ...
- 修改XtraMessageBox的内容字体大小
修改XtraMessageBox的内容字体大小 public static DialogResult Show(UserLookAndFeel lookAndFeel, IWin32Window ow ...
- python之接口继承
接口继承 接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的 基类里面的方法不用具体的实现,只是一个规范而已 1.1实现 ...