【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 ...
随机推荐
- HyperLedger Fabric 1.4 多机多节点部署(10.3)
多机多节点指在多台电脑上部署多个组织和节点,本案例部署一个排序(orderer)服务,两个组织(org1,org2)和四个节点(peer),每个组织包括两个节点,需要五台计算机,计算机配置如下: 多机 ...
- linux 查看内置命令
使用: man shell builtins 查找结果如下:
- Django中ORM简述
ORM:对象关系映射(Object Relational Mapping,简称ORM) 作用:根据类生成表结构,将对象.列表的操作转换成对象的SQL语句,将SQL语句查询的结果转换为对象或列表 优点: ...
- program files与program files(x86)的区别
简单来说:Program Files (x86)存放了一些32位的系统文件.它和正常的Program Files以及Windows文件夹一样,都属于系统文件夹,请勿随意改动. 64位Windows中提 ...
- MySql——查看数据库性能基本参数
使用show status可以查看数据库性能的参数,基本语法:show status like 'value'; 例如: show status like 'Connections';/*连接mysq ...
- php session存入redis
php的会话默认以文件的形式存在,可以配知道NOSQL中,既可以提高访问速度又能好好的实现回话共享,在后期做负载均衡时实现多台服务器session 同步也是比较方便: 一:在php配置文件中改 修改p ...
- python删除文本中的所有空字符
import re import os input_path = 'G:/test/aa.json' output_path ='G:/test/bb.json' with open(input_pa ...
- git基础(1)
一.获取git仓库(两种方法)1.现有目录初始化 git init目录有文件(非空文件)进行跟踪执行:git add+文件名提交:git commit -m(提交信息说明) 2.克隆现有代码仓库的代码 ...
- Python元组与列表的区别和联系?
1. 元组和列表比较相似,不过它们之间也有着不同: (1)列表:一个大仓库,你可以随时往里边添加和删除任何东西. (2)元组:封闭的列表,一旦定义,就不可改变(不能添加.删除或修改). 2. 什么情 ...
- 使用es6总结笔记
1. let.const 和 block 作用域 在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部). let 关键词声明的变量不具备 ...