python 新式类和旧式类

新式类和旧式类

python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧类。

为什么要在2.2中引进new style class呢?官方给的解释是:

为了统一类(class)和类型(type)。

在2.2之前,比如2.1版本中,类和类型是不同的,如a是ClassA的一个实例,那么a.__class__返回 ‘ class    __main__.ClassA‘ ,type(a)返回总是<type ‘instance‘>。而引入新类后,比如ClassB是个新类,b是ClassB的实例,b.__class__和type(b)都是返回‘class ‘__main__.ClassB‘ ,这样就统一了。

引入新类后,还有其他的好处,比如更多的内置属性将会引入,描述符的引入,属性可以来计算等等。

为了向前兼容,默认情况下用户定义的类为经典类,新类需要继承自所有类的基类 object 或者继承自object的新类。

值得注意的地方是,虽然使用的是最新的python(2.7),但是一些特性不会在旧式类起作用。
所以,为了确保自己使用的是新式类,有以下方法:

  1. 把这个赋值语句放在类模块代码的最前面 __metaclass__ = type(前面有提过)。
  2. 自己的类都从内建类object直接或者间接地继承。

如果不需要兼容旧式类,旧版本的类,那么就保持都是新式类。
当然,在Python3里面,不存在这些问题了,因为所有的类都是object类的子类(隐式)。

代码示例:

class CC:            #经典类
    def __init__( self ):
        pass

class CCN(object):    #新类
    def __init__( self ):
        pass 

c1 = CC()
c2 = CCN()

c1.__class__            # 输出-> <class __main__.CC at 0x0137BF10>
type(c1)                # 输出-> <type ‘instance‘>

c2.__class__            # 输出-><class ‘__main__.CCN‘>
type(c2)                # 输出-><class ‘__main__.CCN‘>

dir(c1)
时间: 2024-10-11 14:30:38

python 新式类和旧式类的相关文章

python新式类与旧式类

python2.X是经典类[旧式类]: 是以深度优先[] 但是在Python2.x中,默认都是经典类,只有显式继承了object才是新式类,即:class Person(object):pass 新式类写法class Person():pass 经典类写法class Person:pass 经典类写法 他们最明显的区别在于继承搜索的顺序发生了改变,即经典类多继承搜索顺序(深度优先):先深入继承树左侧查找,然后再返回,开始查找右侧,如图所示: 1           A 2-1 B       

Python新式类和旧式类的区别

新式类是为了统一**而在2.2中开始引入的. 代码讲解 上面的例子比较明白的说明了问题. B是定义的新式类.那么输入b的时候,不论是type(b),还是b.__class__都是输出的<class '__main__.B'>. A是定义的旧式类. ----------------------------------- 另外,新式类和旧式类还有一个区别就是在多继承的时候,查找要调用的方法. 新式类是广度优先的查找算法. 旧式类的查找方法是深度优先的.

python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)

s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin

【面向对象】新式类和旧式类的区别

旧式类: class jiushi(): def __init__(self,a1): self.a=a1 class jiushi_son(jiushi): def __init__(self,a1): jiushi.__init__(self,a1) 新式类:(多继承时) class xinshi(object): def __init__(self, a1): self.a = a1 class xinshi_son(xinshi): def __init__(self, a1): sup

python 之简单浅谈新式类和旧式类(或称经典类)

#_*_coding:utf-8 _*_ #知识点:经典类和新式类的区别 #父类 class Father(object):     def __init__(self):         self.Fname = 'fffffff'         print 'father.__init__'     def Func(self):         print 'funcfurnc'     def Bar(self):         print 'barbarbar'     def T

关于 python 新式类和旧式类继承顺序的验证

参考:http://www.cnblogs.com/blackmatrix/p/5630515.html 官方:https://docs.python.org/2/tutorial/classes.html 关于多继承问题 Python supports a limited form of multiple inheritance as well. A class definition with multiple base classes looks like this: For old-sty

【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 答案引

Python新式类 单例模式与作用域(四)

1 新式类与旧式类 新式类拥有经典类的全部特性之外,还有一些新的特性,比如 __init__发生变化,新增了静态方法__new__,python3目前都采用新式类,新式类是广度优先,旧式类是深度优先 #新式类 class C(object): pass #经典类 class B: pass (1)内置的object对象 1. __new__,__init__方法 这两个方法是用来创建object的子类对象,静态方法__new__()用来创建类的实例,然后再调用 __init__()来初始化实例.

Python新式类

1.Python  2.x版本默认旧式类,通过继承object为新式类 2.新式类广度搜索继承,旧式类深度搜索继承 3.__new__方法 4.统一了类x.__class__和类型(type(x)) 5.增加了__slots__,去除了__dict__属性(用来记录实例中属性和方法,让实例绑定任意属性的字典),只有slots中有的属性才能被使用,不能动态增加属性. 6.增加了__getattribute__方法,该方法在实例访问属性时被调用,无论有没有对应的属性,有返回 7.新增很多管理内建函数