1、除了封装,Python面向对象还有继承这一功能,如下代码,这是简单的继承功能.

class Animal:

    def chi(self):
print(self.name+' 吃')
def he(self):
print(self.name + ' 喝') class Cat:
def __init__(self, name):
self.name = name
def jiao(self):
print('瞄')
class Dog(Animal):#继承Animal这个父类,拥有父类的方法
def __init__(self, name):
self.name = name
def jiao(self):
print(self.name+'汪') Jay = Dog('name')
Jay.chi()#这里就可以调用父类里面的方法

  如果子类和父类都有相同的一个方法,会默认执行子类的方法

/2、

2、Python里面也可以同时继承多个父类,继承方法的优先级是先找自己的方法,然后先左后右

#Python里面一个类可以同时继承多个类,java,C#里面是不可以的
class Animal:
def chi(self):
print(self.name+' 吃')
def she(self):
print(self.name + ' 爱喝')
class god:
def shit(self):
print('shit')
def she(self):
print('黄赌毒')
# class Cat:
# def __init__(self, name):
# self.name = name
# def jiao(self):
# print('瞄')
class Dog(Animal,god):
'''如果方法重复,优先从自己这里寻找,如果方法在两个父类重复
例如这里的she方法,这里默认是左边的父类优先,先在左边父类的寻找
she方法,没有再去下一个父类寻找
'''
def __init__(self, name):
self.name = name
def he(self):
print(self.name + ' 不爱喝')
def jiao(self):
print(self.name+'汪')
Jay = Dog('Jay')
Jay.she()#多个父类的方法继承是先左后右,这里会打印出Jay 爱喝

  在Python3的类的继承里面,是深度优先的,如下面代码

class Jay(object):
def f1(self):
print('Jay')
class A(Jay):
def f(self):
print('A')
class B(Jay):
def f1(self):
print('B')
class C(A):
def f(self):
print('C')
class D(B):
def f(self):
print('D')
class E(C,D):
def f(self):
print('E')
obj = E()
'''在Python3类的继承里面是广度优先的,这里调用f1的方法,会先在E自身里面寻找
,然后接着在C类里面寻找,还是找不到的话会在C的父类A类里面寻找,还找不到就轮
到去D类里面寻找,这里A类B类都继承了Jay这个基类,但是最后才会去Jay里面寻找f1
这个方法,也就是在D和B都找不到f1方法之后才会去Jay类里面寻找,这是广度优先的
体现
'''
obj.f1()#这里输入结果是B

  顺序如图所示

/3

3、多态,Python本身支持多态

#多态,就是多种形态

class Foo:
def f1(self):
print('Foo')
class Bar:
def f1(self):
print('Bar')
def func(arg):#这里显示arg的多种形态,可以是Foo类对象,也可以是Bar类的对象
arg.f1()
f=Foo()
e=Bar()
func(f)#默认参数给的什么就是什么,没有就报错
func(e)

  

4、如果子类和父类都有构造函数,那么可以有两种方法可以继承

class A:
def __init__(self):
print('A的构造方法')
self.name='佳鹏'
self.height = '1.65'
class B(A):
def __init__(self):
print('B的构造方法')
self.age = 23
super(B,self).__init__()#先执行父类的构造方法,再执行自己
b =B()#这样b也有了A的属性
print(b.__dict__)

  结果如图所示

还有一种方法是这样

class A:
def __init__(self):
print('A的构造方法')
self.name='佳鹏'
self.height = '1.65'
class B(A):
def __init__(self):
print('B的构造方法')
self.age = 23
A.__init__(self)#执行父类的构造函数,把B的实例传进去
b =B()#这样b也有了A的属性
print(b.__dict__)

  结果是一样的。

5、在Python2里面,有经典类和新式类之分,下面的图是Python2里面默认的经典类

这里输出的是A,这一种彻底的深入优先,而在Python3里面,由于B类C类都继承A,所以在先找B再找C,最后找A

在Python2里面还有一个新式类,如图,这里在A类那里继承了个object,这里的继承和Python3一样

这里输出的是C

如图是总结

最新文章

  1. 数据结构快速回顾——平衡二叉树 AVL (转)
  2. Memcache 内存分配策略和性能(使用)状态检查
  3. mysql 日期加减操作
  4. MySQL concat函数的使用
  5. 完成了第一个java
  6. uC/OS-II源码分析
  7. 1071: [SCOI2007]组队 - BZOJ
  8. 如何使用OPENQUERY访问另一个SQL Server
  9. Ubuntu环境变量设置
  10. [Android]Android焦点流程代码分析
  11. CF24D Broken robot
  12. Zabbix appliance manual
  13. 大数据入门到精通7--对复合value做reducebykey
  14. [UE4]把枪打飞addImpulse
  15. golang-bcc-bpf-function-tracing
  16. 永久激活navicat_premium12.0,支持win32和64位
  17. 【转载】惠新宸:PHP在百度的应用现状及展望
  18. IE报错:缺少标识符、字符串或数字
  19. ubuntu部署kubeadm1.13.1高可用
  20. c++ 子类切勿重新定义父类 non-virtual函数

热门文章

  1. IOS 模仿有storyboard的项目控制器的创建
  2. hdu-1068&&POJ1466 Girls and Boys---最大独立集
  3. 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)
  4. 2018.6.4 Oracle数据库预定义的异常列表
  5. C/C++程序基础 (七)继承和多态
  6. k8s的pv和pvc简述
  7. Centos7在运行yum命令时出现报错及排查处理过程
  8. PHP实现消息推送
  9. Ansible学习 安装
  10. Yii2.X 如何避开pathinfo不能处理中文名开头的bug