继承

类的继承机制使得子类可以继承父类中定义的方法,拥有父类的财产,比如有一个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方法!

最新文章

  1. [原创]MySQL RR隔离级别下begin或start transaction开启事务后的可重复读?
  2. linux 录制并回放终端会话
  3. jquery遍历
  4. linux下一个有意思的问题(文件名以短划线或空格开头)
  5. Android数据共享
  6. Jquery - Select 和 Checkbox 、Textarea的操作
  7. 为了以后愉快的玩耍,Virtualbox安装Ubuntu
  8. 《Mathematical Olympiad——组合数学》——抽屉原理
  9. Linux高性能server编程——Linux网络基础API及应用
  10. delphi 输入文件相对路径的更改,更改成用户的
  11. angularjs-1.3代码学习-$parse
  12. Sublime Text编辑器如何隐藏顶部的菜单栏
  13. MySQL DATEDIFF() 函数
  14. 服务治理利器Hystrix-理论篇
  15. 100 - k8s源码分析-准备工作
  16. DOM简单梳理
  17. centos7/RHEL7下快速搭建DNS域名解析服务器
  18. Docker学习—Docker简介
  19. 移动Web制作——JD案例
  20. WPF圆角按钮例程

热门文章

  1. 在Hibernate映射文件里配置Sequence
  2. sql server 创建索引 超时时间已到
  3. Windows Server2008上安装VS2008出错及解决办法
  4. Win10怎么批量修改文件后缀名?
  5. codeforces 468B two set(并查集)
  6. 【真·干货】MySQL 索引及优化实战
  7. 基于BootStrap,FortAweSome,Ajax的学生管理系统
  8. 【XSY3347】串后缀
  9. Ural 1996 Cipher Message 3 (生成函数+FFT)
  10. 猫狗分类--Tensorflow实现