Python之面向对象新式类和经典类
Python之面向对象新式类和经典类
新式类和经典类的继承原理:
在Python3中,就只有新式类一种了。
先看Python3中新式类:
类是有继承顺序的:
Python的类是可以继承多个类的,也就是多继承。
Python的类如果继承了多个类,那么其寻找的方法有两种,分贝为:深度优先 and 广度优先。

当类是经典类时:多继承状态下,按深度优先查找。
当类是新式类时:多继承状态下,按广度优先查找。
广度优先的顺序:不走到头,再走完所有分支的情况下走最后的头。
#新式类的继承,在查找属性时遵循:广度优先
# class A(object):
# def test(self):
# print('from A')
# pass
# class B(A):
# # def test(self):
# # print('from B')
# pass
# class C(A):
# # def test(self):
# # print('from C')
# pass
# class D(B):
# # def test(self):
# # print('from D')
# pass
#
# class E(C):
# # def test(self):
# # print('from E')
# pass
# class F(D,E):
# # def test(self):
# # print('from F')
# pass
# f1=F()
# # f1.test()
#
# # print(F.__mro__)
# print(F.mro()) #广度优先:F->D->B->E->C->A->object
MRO:
MRO是一种算法,用于计算在继承过程中,类的继承顺序。
所有父类的MRO列表并遵循如下的三条准则:
1、子类会优先于父类被检查。
2、多个父类会根据他们在列表中的顺序被检查。
3、 如果对下一个类存在两个合法的选择,选择第一个父类。
注意:MRO的用发只有新式类可以用,Python2的经典类是用不了的。
在Python2中的类的新式和经典的区别:
在Python2中的新式类中,最终的父类要写object,而Python3的新式类不用写。
其余的新式类和Python3一致。
Python2中的经典类的继承:
在Python2中的经典类继承是深度优先的查找原则:
#python2中经典类的继承,在查找属性时遵循:深度优先
class A:
# def test(self):
# print('from A')
pass
class B(A):
# def test(self):
# print('from B')
pass
class C(A):
# def test(self):
# print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass class E(C):
# def test(self):
# print('from E')
pass
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test() # F->D->B->A->E->C
Super的用法:
在子类里调用父类的方法是,不要直接去调用,不要用 “类名. 方法” 的方法去调用。
而是用Super的方法。
Super只能用于新式类。
Super函数:
注意:Super函数的参数,第一个类名,一定是自己的类名。
#coding:utf-8
#super在python2中的用法:
# 1:super(自己的类,self).父类的函数名字
# 2:super只能用于新式类
class People(object):
def __init__(self,name,sex,age):
self.name=name
self.age=age
self.sex=sex def walk(self):
print('%s is walking' %self.name) class Chinese(People):
country='China'
def __init__(self,name,sex,age,language='Chinese'):
# self.name=name
# self.sex=sex
# self.age=age
# People.__init__(self,name,sex,age)
super(Chinese,self).__init__(name,sex,age)
self.language=language c=Chinese('egon','male',18)
print (c.name,c.age,c.sex,c.language) ######## 在python3中 ########
class People:
def __init__(self,name,sex,age):
self.name=name
self.age=age
self.sex=sex def walk(self):
print('%s is walking' %self.name) class Chinese(People):
country='China'
def __init__(self,name,sex,age,language='Chinese'):
# self.name=name
# self.sex=sex
# self.age=age
# People.__init__(self,name,sex,age)
super(Chinese,self).__init__(name,sex,age)
self.language=language def walk(self,x):
super().walk()
print('子类的x',x) c=Chinese('egon','male',18)
print(c.name,c.age,c.sex,c.language)
c.walk(123)
Python之面向对象新式类和经典类的更多相关文章
- python之继承、抽象类、新式类和经典类
一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你 ...
- python中新式类和经典类的区别
1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类 ...
- Python新式类与经典类的区别
1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...
- python中的__new__与__init__,新式类和经典类(2.x)
在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...
- Python 新式类与经典类
新式类,经典类 查询匹配 广度查询 横着对每个类进行查询 深度查询 无视平级类,直接寻找下级类 #python 3.0 #新式类 广度查询 #经典类 广度查询 #python 2.0 #新式类 广度查 ...
- 面向对象【day07】:新式类和经典类(八)
本节内容 1.概述 2.类的多继承 3.经典类VS新式类 4.总结 一.概述 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类,下 ...
- python中新式类和经典类
python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...
- Python新式类和经典类的区别
@Python新式类和经典类的区别 class ClassicClass(): pass class NewStyleClass(object): pass x1 = ClassicClass() x ...
- Python类总结-继承-子类和父类,新式类和经典类
子类和父类 class Father(object): #子类在使用super调用父类时,Father后面要加object --新式类 def __init__(self): self.Fname = ...
随机推荐
- P2479 [SDOI2010]捉迷藏
传送门 KDtree是个吼东西啊-- 枚举每一个点,然后求出离他距离最远和最近的点的距离,更新答案 然而为什么感觉KDtree只是因为剪枝才能跑得动呢-- //minamoto #include< ...
- bootstrap 弹出框 另类运用
下面是我在做一个简单登录页面时,应用boostrap弹出框,通过调节做成警示框的过程,前后经过了一番波折.因为摸索过程十分有趣,最后也是成功的,使用弹出框做除了警示框的效果,下面我们来看一下吧. 首先 ...
- C++中的static修饰的变量和函数
原文地址:http://blog.csdn.net/he3913/archive/2008/09/18/2944737.aspxC++里的静态成员函数(不能用const的原因+static在c++中的 ...
- 《windows核心编程系列》二十二谈谈修改导入段拦截API。
一个模块的导入段包含一组DLL.为了让模块能够运行,这些DLL是必须的.导入段还包含一个符号表.它列出了该模块从各DLL中导入的符号.当模块调用这些导入符号的时候,系统实际上会调用转换函数,获得导入函 ...
- [CF1109F]Sasha and Algorithm of Silence's Sounds
题意 有一个\(n*m\)的网格,每个格子有一个数,为\(1\)~\(n * m\)的排列 一个区间\((1<=l<=r<=n*m)\)是好的,当且仅当:数值在该区间内的格子,构成一 ...
- Bryce1010的linux课程设计
1.设计目的 2.软件环境 3.要求 4.需求分析 5.总体设计 6.详细设计 7.调试与测试 8.总结 思路整理: 1.如果要开始编译着手的准备 SQLite数据库的安装 gtk+的安装 (.... ...
- 绿化VSCode
通过啃源码, 终于找到了解决办法, 设置环境变量: VSCODE_APPDATA=C:\Program Files\VSCode\UserData VSCODE_EXTENSIONS=%VSCODE_ ...
- Java:核心概念j积累(一)
1. 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过 ...
- iOS programming UITabBarController
iOS programming UITabBarController 1.1 View controllers become more interesting when the user's acti ...
- 关于Qt模态框总汇
转载请注明出处:http://www.cnblogs.com/dachen408/p/7285710.html 父窗体为QMainWindow: 当子窗体为: 1.QWidget,需要设置 this- ...