Python面向对象之类的继承(2)
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
如图是总结

Python面向对象之类的继承(2)的更多相关文章
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- Python - 面向对象编程 - 多继承
继承的详解 https://www.cnblogs.com/poloyy/p/15216652.html 这篇文章讲的都是单继承,Python 中还有多继承 Python 多继承的背景 大部分面向对象 ...
- Python()- 面向对象三大特性----继承
继承: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类(基类或超类),新建的类是所继承的类的(派生类或子类) 人类和狗 有相同的属性, 提取了一个__init__方法,在这 ...
- python 面向对象八 多继承
python是支持多继承的,在设计类的继承关系时,通常,主线都是单一继承下来的.但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn. 为了更好地看出继承关系,以Mi ...
- python 面向对象及封装继承和多态
######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...
- 47、Python面向对象中的继承有什么特点?
继承的优点: 1.建造系统中的类,避免重复操作. 2.新类经常是基于已经存在的类,这样就可以提升代码的复用程度. 继承的特点: 1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要 ...
- Python面向对象,析构继承多态
析构: def __del__(self): print("del..run...") r1 = Role("xx") del r1 结果打印del..run. ...
- python面向对象--私有和继承
一. 私有属性和私有方法 应用场景 在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到 私有属性 就是 对象 不希望公开的属性 (属性即类里面的变量) 私有方法 就是 ...
随机推荐
- [Asp.Net] Global.asax
Global.asax.cs文件会被编译到对应的dll 但部署是还需要Global.asax文件 class Global中的方法才会在程序启动时执行
- HDU5171 矩阵快速幂
题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=5171 算法: 可以先将数组a[]排序,然后序列 a1 , a2 , … , an 即为有序序列,则第一 ...
- wamp端口冲突
因为端口冲突,Apache服务不能运行. 解决方法: 点击wamp图标 => Apache => use a port other than 80 => 输入新的端口,即可. 然后 ...
- UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)
题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离 ...
- 实现Hbase的分页
作者:R星月 出处:http://www.cnblogs.com/rxingyue 欢迎转载,也请保留这段声明.谢谢! 做一个项目中由于数据量比较大,并且需要定时增量分析,做了hbase的分页.项目中 ...
- void (*signal(int sig, void (*func) (int))) (int)理解
http://blog.csdn.net/sever2012/article/details/8281271 1.signal( int sig, void (*func)(int))signal是一 ...
- 逗塔战争TD新人入门图文攻略
逗塔战争TD新人入门图文攻略 <逗塔战争TD>是一张基于DOTA改编的塔防TD,很多玩家都很喜欢这张图,新手玩家怎么快速上手这张图呢?这张图的玩法和基本规则并不难,下面就为大家带来新人 ...
- Java基础面试题:String 和StringBuffer的区别
package com.swift; import java.util.Date; public class Getclass_Test extends Date { public static vo ...
- SummerVocation_Leaning--java动态绑定(多态)
概念: 动态绑定:在执行期间(非编译期间)判断所引用的对象的实际类型,根据实际类型调用其相应的方法.如下例程序中,根据person对象的成员变量pet所引用的不同的实际类型调用相应的方法. 具体实现好 ...
- js原生实现三级联动下拉菜单
js代码: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...