Python之面向对象新式类和经典类
2024-08-28 06:01:36
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)
最新文章
- 解决NetBeans 8.x的字体问题
- iOS开发,URL编码和解码
- 两套JRE
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
- 使用 IN 的子查询
- Android Design Support Library——TabLayout
- yepnope初体验
- C# 线程--第四线程实例
- elementary os进入GUI桌面环境失败
- 2014年度辛星css教程夏季版第二节
- 基于HTML5 Canvas的网页画板实现教程
- 如何实现调用console.log(‘good’.repeat(3))时输出goodgoodgood?
- [置顶] Android中使用sqlite3操作SQLite
- LVM逻辑卷管理@设备、格式、摩、引导自己主动安装一个完整的章节
- TCP通信中的大文件传送
- ubuntu11.10server 安装php-redis插件
- Linux Centos安装及卸载Apache
- HDU - 2147 kiki's game 巴什博弈
- Spark:导入数据到oracle
- SQLI DUMB SERIES-17
热门文章
- bzoj 4071: [Apio2015]巴邻旁之桥【splay】
- 理解Javascript的闭包【转】
- hdu 4565 So Easy! (共轭构造+矩阵快速幂)
- 【BZOJ3309】DZY Loves Math(线性筛)
- magento controller直接渲染Block 以及传参
- sqlserver事务隔离
- LN : leetcode 343 Integer Break
- Swift 中的基础语法(二)
- colormap画出的图不是彩色问题
- [Android]Android Design之Navigation Drawer