【Python】Python 新式类介绍
本文转载自:kaka_ace's blog
我们使用 Python 开发时, 会遇到 class A 和 class A(object) 的写法,
这在 Python2 里是有概念上和功能上的区别, 即经典类(旧式类)与新式类的区别,
英文上分别描述为 old-style(classic-style) 与 new-style.
通过搜索, 先查阅了三个资料链接:
官方文档
stackoverflow 解答
Python Types and Objects
根据 stackoverflow 答案引出的语言发明者 Guido 写的一篇文章:
The Inside Story on New-Style Classes
其总结可以作为官方解释:
low-level constructors named __new__() – 低级别的构造函数.
Note: Python 的 class __init__ 并不是其他语言意义上的构造函数,
在 new 创建实例后对实例属性初始化的函数.descriptors, a generalized way to customize attribute access – 描述符.
或者说描述符协议支持.descriptor protocol __get__, __set__ ,__delete__ 等,
可以阅读descriptor 文档static methods and class methods - 静态方法和类方法
properties (computed attributes) – 属性访问 setter getter.
decorators (introduced in Python 2.4) – 装饰器.
现在装饰器语法糖遍布各Python框架.slots – 用户设置后可以限定实例的属性.
在 Python2 中替代 __dict__, 可以节省近 2/3 内存, Python3 中可以
不因为优化内存使用率而使用 slots, 因为 __dict__ 结构内存做了优化,
Note: __dict__ 并不是 Python 意义上的内置的 dict, 其实是一个 proxy 类.a new Method Resolution Order (MRO) – MRO 方法解析次序改变
(由左递归改为C3算法)
另一个答案增加了一点:
- super added – super 方法支持
关于C3MRO介绍, 可以点击链接
以下是翻译官方文档的资料 (Python2的内容)
Classes and instances come in two flavors: old-style (or classic) and new-style.
类和实例有两种方式: 旧式(或者经典) 和 新式类.
Up to Python 2.1 the concept of class was unrelated to the concept of type,
and old-style classes were the only flavor available. For an old-style class,
the statement x.__class__ provides the class of x, but type(x) is always
<type ‘instance’>. This reflects the fact that all old-style instances, independent
of their class, are implemented with a single built-in type, called instance.
一直到 Python 2.1 class 的概念不与 type 不一样, 旧式类是唯一的风格. 对于一个
旧式类里, 陈述句 x.__class__ 提供 x 的 class, 但是 type(x) 一直是 <type ‘instance’>.
它反应了所有旧式类实例, 独立于它们的 class, 它们通过一个简单的内建 type 实现,
被称作 实例 instance.
New-style classes were introduced in Python 2.2 to unify the concepts of class
and type. A new-style class is simply a user-defined type, no more, no less.
If x is an instance of a new-style class, then type(x) is typically the same as
x.__class__ (although this is not guaranteed – a new-style class instance is
permitted to override the value returned for x.__class__).
新式类在Python 2.2 引入, 用于统一 class 和 type 的概念. 一个新式类简化了用户
自定义的 type, 不多不少. 如果 x 是一个新式类的实例 instance , type(x) 典型地
与 x.__class__ (尽管这并不能保证 – 一个新式类被允许重写 x.__class__ 的值)一致.
eg:
>>> class A(object): pass
>>> a = A()
>>> a.__class__
>>> <class ‘__main__.A’>
>>>
>>> type(a)
>>> <class ‘__main__.A’>
而 class A 的 type 和 __class__ 是 <type ‘type’>
>>> A.__class__
>>> <type ‘type’>
The major motivation for introducing new-style classes is to provide a unified
object model with a full meta-model. It also has a number of practical benefits,
like the ability to subclass most built-in types, or the introduction of
“descriptors”, which enable computed properties.
引入新式类主要的改进是提供统一的带有完整 meta-model 的 object model.
它可以拥有大量的使用价值, 类似于 内建 type的 subclass的能力 或者 描述符
descriptors 介绍(允许使用的计算属性)
For compatibility reasons, classes are still old-style by default. New-style
classes are created by specifying another new-style class (i.e. a type) as a
parent class, or the “top-level type” object if no other parent is
needed. The behaviour of new-style classes differs from that of
old-style classes in
a number of important details in addition to what type() returns. Some of these
changes are fundamental to the new object model, like the way special methods
are invoked. Others are “fixes” that could not be implemented before for
compatibility concerns, like the method resolution order in case of multiple
inheritance.
考虑到兼容的因素, class 使用默认是旧式类. 新式类通过指定的另一个新式类
(如 一个 type)作为父类, 或者是顶级类 object(如果没有其他父类需要)创建.
除了 type() 的返回方式,新式类与旧式类的行为从大量重要细节区分. 这些变化
对于新式类 oject model 是基础性的, 类似如 特别的方法被调用时的方式. 其他
特性属于修复以前不能实现的兼容性问题, 例如多重继承下的 MRO 方法解析次序.
Tips:
1. 旧式类多重继承使用的是左递归遍历方式
2. 新式类多重继承算法使用 C3 算法.
While this manual aims to provide comprehensive coverage of Python’s class
mechanics, it may still be lacking in some areas when it comes to its coverage
of new-style classes. Please see https://www.python.org/doc/newstyle/ for
sources of additional information.
该手册目标是提供综合性地覆盖介绍 Python 的 class 机制, 在新式类的覆盖
范围内, 它可能依然会在某些方面缺少信息. 请阅读 https://www.python.org/doc/newstyle/
来获额外的信息源.
Old-style classes are removed in Python 3, leaving only new-style classes.
旧式类在 Python3 中去除, 只保留新式类.
原创文章,转载请注明: 转载自kaka_ace's blog
参考资料:
1.http://www.zhihu.com/question/19754936
【Python】Python 新式类介绍的更多相关文章
- python中新式类和经典类
python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...
- python中新式类和经典类的区别
1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类 ...
- Python中新式类 经典类的区别(即类是否继承object)
首先什么是新式类 经典类呢: #新式类是指继承object的类 class A(obect): ........... #经典类是指没有继承object的类 class A: ........... ...
- python 面向对象 新式类和经典类
# 经典类写法 # schoolMember.__init__(self, name, age, sex) # 新式类写法 super(Teather, self).__init__(name, ag ...
- Python中新式类和经典类的区别,钻石继承
1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...
- python基础===新式类与经典类
首先: Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式的继承object 这两种类的区别: 新式类重定义的方法更多,当然这不 ...
- python基础--新式类实现单例模式
在网上看了有关python实现单例模式的博客,发现好多都是转载的,并且都是按照python2.x版本旧式类的方式写的. 虽然也能读懂,但对于我这种一开始学的就是python3.x的新手来说,心里总有点 ...
- python之新式类与经典类
经典类与新式类 经典类:P 或 P()--深度查找,向上查父节点 新式类 :P(object)---广度查找,继承object,新式类的方法较多
- python 3新式类的多继承
因为我用的是python3,所以所用到的类都是新式类,这里我说的都是新式类,python2类的继承复杂一些,主要有新式类和老式类.python3类(新式类)的继承是是广度优先(BFS),实例如下: c ...
随机推荐
- 如何将github项目上传至gitlab
一.修改远程分支关联 删除远程分支关联 将指向github的远程分支关联关系删除 git remote rm origin 添加新的远程分支关联 新的remote地址指向gitlab相应地址 git ...
- HttpClient的Content-Type设置
HttpClient的Content-Type设置 最近在对接公司内容的一个云服务的时候,遇到一个问题,就是如果使用HttpClient如何设置post时候的Content-Type? public ...
- 在XAML中为ItemsControl定义分组,适合mvvm绑定
可以先参考一下这个文章: http://www.cnblogs.com/zoexia/archive/2014/11/30/4134012.html step0: 先展示一下最简陋的界面: 上图是一个 ...
- linux进程的学习笔记(未完)
1. 进程是程序执行的一个实例,如果16个用户同时运行vi,那么有16个独立的进程,尽管它们共享同一个可执行代码,问题在于FreeRTOS这种系统,是否可以建2个相同的任务,需要注意什么?在linux ...
- Sql Server Profiler使用
在使用Entity Framework的过程当中,有时候需要看Entity Framework自动生成的Sql语句,在客户端可以使用跟踪的方法看到每次查询时的Sql语句,其实通过数据库 ...
- 一文带你了解 Raft 一致性协议的关键点
此文已由作者孙建良授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Raft 协议的发布,对分布式行业是一大福音,虽然在核心协议上基本都是师继 Paxos 祖师爷(lampor ...
- Prism MEF example
Related Attributes These attributes are under namespace System.ComponentModel.Composition Import The ...
- Qt-LCD电子时钟
先上效果图吧 就是这个样子,简单的时间显示时间. 这里需要注意的是,我们最好建立一个空文件,这里我们需要建立一个集成QLCDNumber的类 具体方法如下图 一下是源代码 digiclock.h #i ...
- Appium Inspector定位元素与录制简单脚本
本次以微信为例, 使用Appium自带的Inspector定位工具定位元素, 以及进行最最最简单脚本的录制: capabilities = { "platformName": &q ...
- Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版
作者:Antonio Leiva 时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1. ...