美文网首页
Python面向对象中:经典类和新式类的区别

Python面向对象中:经典类和新式类的区别

作者: 翌日千里 | 来源:发表于2017-07-30 10:24 被阅读64次

    Python 2.x中默认都是经典类,只有显式继承了object才是新式类
    Python 3.x中默认都是新式类,不必显式的继承object
    当类是经典类时,多继承情况下,会按照深度优先方式查找
    当类是新式类时,多继承情况下,会按照广度优先方式查找

    1. 写法不一样
    class A:
        pass
    
    class B(object):
        pass
    
    1. 在多继承中,新式类采用广度优先搜索,而经典类是采用深度优先搜索。
    # 经典类例子
    class A:
        def __init__(self):
            print 'This is A'
        def save(self):
            print 'save method from A'
    class B (A):
        def __init__(self):
            print 'this is B'
    class C (A):
        def __init__(self):
            print 'this is C'
        def save(self):
            print 'save mothod from C'
    class D(B,C):
        def __init__(self):
            print 'this is D'
    d=D()
    d.save()
    # 输出结果:经典类的搜索顺序是D->B->A,是一种深度优先查找方式
    this is D
    save method from A
    
    # 新式类例子:
    class A(object):
        def __init__(self):
            print 'This is A'
        def save(self):
            print 'save method from A'
    class B (A):
        def __init__(self):
            print 'this is B'
    class C (A):
        def __init__(self):
            print 'this is C'
        def save(self):
            print 'save mothod from C'
    class D(B,C):
        def __init__(self):
            print 'this is D'
    d=D()
    d.save()
    
    # 运行结果:新式类的搜索顺序是D->B->C->A,是一种广度优先查找方式
    this is D
    save mothod from C
    
    1. 新式类新增
      1. 新式类对象可以直接通过__class__属性获取自身类型:type
      2. 新式类增加了__getattribute__方法
      3. 新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。
      class Person(object):
      __slots__ = ('name', 'age')   #只允许Person拥有name和age属性
      def __init__(self):
          self.name='aline'
          self.age=20
          self.sex='female'
      person=Person()
      
      # 运行结果:报错
      AttributeError: 'Person' object has no attribute 'sex'
      

    相关文章

      网友评论

          本文标题:Python面向对象中:经典类和新式类的区别

          本文链接:https://www.haomeiwen.com/subject/rdphlxtx.html