python 经典类和新式类

DAY 12. python新式类和旧式类

继承自object基类的类叫做新式类,否则叫做旧式类,python3中的类默认是新式类,之前版本默认是旧式类

root@kail:~# python
python 2.7.15 (default,Jul 28 2018,11:29:29)
[GCC 8.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A():
...     pass
...
>>> a=A()
>>> dir(a)
['__doc__','__module__']

如上,在python2中定义一个类,不继承任何基类,内建属性只有两个,这就是旧式类,如果想要创建一个新式类,需要显式的继承object基类,如:

root@kail:~# python
python 2.7.15 (default,Jul 28 2018,11:29:29)
[GCC 8.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     pass
...
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

新式类默认有很多属性,都是从object基类中继承过来的,而在python3中所有类默认继承object基类

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class A:pass
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>>

每个属性的具体用法参见Python——特殊属性与方法

12.1 新式类和旧式类的区别

  1. 根本区别:新式类继承自object基类,旧式类不继承任何基类
  2. MRO不同:新式类和经典类的方法解析顺序(MRO)不同,经典类使用DFS,新式类使用C3算法

python 2.7

class A():name = 'A'age = 12class B():name = 'B'class C():name = 'C'class D(A,B):name = 'D'class E(A,C):name = 'E'age = 13class F(D,E):passprint F.name  # D
print F.age  # 12

上面的继承关系是:

A,age=12
D
B
A
E,age=13
C
F

显然在age的继承上,2.7使用了DFS,我们再看3.7

python 3.7

class A():name = 'A'age = 12class B():name = 'B'class C():name = 'C'class D(A,B):name = 'D'class E(A,C):name = 'E'age = 13class F(D,E):passprint(F.name)  # D
print(F.age)  # 13

显然3.7没有使用DFS,而是在每一次寻找入度为零的节点,加入mro列表后删除这条边,再次寻找,以上面的代码为例,第一个入读为0的节点就是F,所以mro表的第一项就是F,删除F及相连的边,入度为0的就是DE,按照书写代码的顺序第二项为D,第三项为E,依次,最终所有新式类继承自object,所以最后一项就是object,继承顺序就是按mro列表的顺序来的,可以使用mro()查看mro列表

print(F.mro())
# [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]

也就是说,C3是先在水平方向上查找,再往上查找

12.2 总结

基类MRO备注
经典类NoneDFSpython2默认经典类
新式类objectC3python3默认新式类

我尝试在python3中通过重写type元类写出经典类,但发现这样写出的类似乎不是真的经典类,只是默认属性和经典类差不多,MRO行为依旧和新式类一样,可能是我代码有问题,请各位大佬赐教

class Type(type):__bases__ = ()__base__ = None__mro__ = (None,)Foo1 = Type('Foo1',() ,{})
Foo2 = Type('Foo2', (), {})
Foo3 = Type('Foo3', (), {})
Foo4 = Type('Foo4', (Foo1, Foo2), {})
Foo5 = Type('Foo5', (Foo1, Foo3), {})
Foo6 = Type('Foo6', (Foo4, Foo5), {})if __name__ == '__main__':# base 为空时会多出两个属性,第一个与类描述有关,第二个与弱拷贝有关print(dir(Foo1))  # ['__dict__', '__doc__', '__module__', '__weakref__']print(dir(Foo2))  # ['__dict__', '__doc__', '__module__', '__weakref__']print(dir(Foo3))  # ['__dict__', '__doc__', '__module__', '__weakref__']# base 不为空时,默认属性表现的和经典类一样print(dir(Foo4))  # ['__doc__', '__module__']print(dir(Foo5))  # ['__doc__', '__module__']print(dir(Foo6))  # ['__doc__', '__module__']# 假如定义的是经典类,这里应该不能调用mro方法,但这里调用了,说明本身就不对,并且mro列表最后是object,进一步说明这还是一个新式类print(Foo1.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo2.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo3.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo4.mro())  # [<class '__main__.Foo4'>, <class '__main__.Foo1'>, <class '__main__.Foo2'>, <class 'object'>]print(Foo5.mro())  # [<class '__main__.Foo5'>, <class '__main__.Foo1'>, <class '__main__.Foo3'>, <class 'object'>]# 清楚的看到MRO使用的是C3算法print(Foo6.mro())  # [<class '__main__.Foo6'>, <class '__main__.Foo4'>, <class '__main__.Foo5'>, <class '__main__.Foo1'>, <class '__main__.Foo2'>, <class '__main__.Foo3'>, <class 'object'>]# TODO: 如何在python3中定义经典类,还是根本不能定义,抛砖引玉,请赐教

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Why does pthread_cond_signal not work?【转】

转自&#xff1a;http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work# 0 down vote favorite I am currently learing all around POSIX threads (pthread). I now have created a simple program which increased a shared value by 7 until…

Android开发技术周报 Issue#72

新闻 Android N 最初预览版&#xff1a;开发者 API 和工具教程 Gradle依赖的统一管理 理解Java垃圾回收机制 浅谈 Android 编程思想和架构 由Android 65K方法数限制引发的思考 Android音频开发&#xff08;1&#xff09;&#xff1a;基础知识 Android音频开发&#xff08;…

python 单例模式的四种实现方法

DAY 13. 单例设计 13.1 什么是单例设计 一个类每次实例化返回的都是同一个对象&#xff0c;这种设计模式叫做单例设计&#xff0c;这个类叫做单例类 13.2 实现单例设计的方法 13.2.1 重写__new__() class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次实例化&…

Redis3.2.5部署(单节点)

1.安装jdk1.8 [rootsht-logstash-01 ~]# cd /usr/java/ [rootsht-logstash-01 java]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111…

字节跳动 设计模式 pdf_凭这份pdf我拿下了美团、字节跳动、阿里、小米等大厂的offer...

关于程序员&#xff0c;除了做项目来提高自身的技术之外&#xff0c;还有一种提升自己的专业技能就是&#xff1a;多&#xff01;看&#xff01;书&#xff01;小编整理出一篇Java进阶架构师之路的核心知识&#xff0c;同时也是面试时面试官必问的知识点&#xff0c;篇章也是包…

B. One Bomb (#363 Div.2)

B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a description of a depot. It is a rectangular checkered field of n  m size. Each cell in a field can be empty (".") or…

力扣交替打印FooBar

这道题要注意的是两个线程唤醒和等待的顺序&#xff0c;应为第一个线程会比第二个线程更早结束&#xff0c;所以如果第一个线程已经结束&#xff0c;而第二个线程还在等待被唤醒&#xff0c;那第二个线程会一直等待下去&#xff0c;因此第一个线程要先等待后唤醒&#xff0c;这…

项目开发容易出错情况统计

2016年11月17日 11:30:45 星期四 1.适配&#xff1a; a) APP弹窗大屏幕适配&#xff08;例如&#xff0c; 是否居中&#xff09; 2.按钮状态&#xff1a; a) 按钮点击后没有disable 如果新页面加载卡顿导致用户多次点击&#xff0c;生成多次请求 b) 按钮disable后什么时候enabl…

python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载&#xff0c;转载请联系出处。人生苦短&#xff0c;我该不该选择Python&#xff1f;编程语言几年一变样&#xff0c;榜单之争也是愈演愈烈&#xff0c;还架不住时不时杀出个黑马……而对于Python&#xff0c;自2010年初以来一直蓬…

android 音频播放总结 soundlPool,MediaPlay

soundlPool 用于小音频的播放多个同时播放。 使用步骤&#xff1a; 步骤一&#xff1a; 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下&#xff0c;区别在于assets下可以再新建文件夹而raw不行&#xff0c;assets内部单个文件超过1m时可能存在bug而raw不会…

文本分析软件_十大针对机器学习的文本注释工具与服务,你选哪个?

房地产和键【51CTO.com快译】目前&#xff0c;从搜索引擎与情感分析&#xff0c;到虚拟助手与聊天机器人&#xff0c;机器学习应用场景中的许多研究领域&#xff0c;都需要通过文本注释工具与服务来提供准确性。在AI研究与开发行业中&#xff0c;发现或创建可注释的数据对于项目…

sqlite创建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收机制

DAY 18. python垃圾回收机制 python GC主要有三种方式 引用计数标记清除分代回收 其中&#xff0c;以引用计数为主。 18.1 引用计数&#xff08;Reference Counting&#xff09; 《寻梦环游记》中说&#xff0c;人一生会经历两次死亡&#xff0c;一次是肉体死的时候&#…

曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家

荷重位移曲线仪广泛适用于各种按键及开关、DOME片、按键、微力弹片、硅胶按键、汽车开关之荷重-行程测定&#xff1b;Windows中英文双语软件&#xff0c;操作简单方便&#xff0c;软件流畅稳定&#xff0c;所有测试资料(测试条件&#xff0c;曲线&#xff0c;数据结果&#xff…

进程调度

1、策略 策略决定调度程序在何时让什么进程运行。调度器的策略往往决定系统的整体印象&#xff0c;并且&#xff0c;还要负责优化使用处理器时间。 1.1 I/o消耗型和处理器消耗型。 进程可以被分为I/O消耗型和处理器消耗型。前者指进程的大部分时间用来提交I/O请求或者等待I/O请…

Django,Ajax,Vue实现文章评论功能

Django评论 评论复杂的地方在于需要实现点击提交评论后评论内容需要立刻出现在下面&#xff0c;还要保持页面位置不变&#xff0c;所以提交后不能整体刷新页面&#xff0c;因为刷新以后页面肯定在最上面&#xff0c;而评论一般都在最下面&#xff0c;所以要用到Ajax 整个过程用…

回归分析什么时候取对数_冬蜜什么时候取,冬天取蜂蜜的方法

大家好&#xff0c;我现在分享的是&#xff0c;在冬天是在什么时候取蜜&#xff01;冬天在我们南方&#xff0c;取蜜时间是十一月到十二月的时候&#xff0c;只要温度达到15度以上&#xff0c;蜂蜜封盖了就可以取蜜了&#xff0c;并且在冬天我们只能取一次&#xff0c;最晚取蜜…

Opencv与dlib联合进行人脸关键点检测与识别

前言 依赖库&#xff1a;opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置&#xff0c;重点在实现上。使用libfacedetection实现人脸区域检测&#xff0c;联合dlib标记人脸特征点&#xff0c;最后使用opencv的FaceRecognizer实现人脸识别。 准备工作 1、配置好Op…

Category 的一些事

来源&#xff1a;伯乐在线 - Tsui YuenHong 链接&#xff1a;http://ios.jobbole.com/90422/ 点击 → 申请加入伯乐在线专栏作者 新增实践部分&#xff1a;偏方 Hook 进某些方法来添加功能 Category – 简介 Category&#xff08;类别&#xff09;是 Objective-C 2.0 添加的新特…

python tfidf特征变换_机器学习的“万能模板” - 数据分析

最后是文本变量。很遗憾Titanic数据集中没有合适的文本变量。一般我们处理文本变量的方法是&#xff0c;合并所有的文本形成一个变量&#xff0c;然后调用Count Vectorizer或者TfidfVectorizer算法&#xff0c;将文本数据转换成数字。大部分情况下&#xff0c;TfidfVectorizer比…