Python 2 和 Python 3 在面向对象编程方面存在一些显著的差异,Python 3 的面向对象特性更为简洁和统一,解决了许多 Python 2 中的局限性和不一致性。如果有可能,建议使用 Python 3 进行开发,以充分利用其改进的面向对象编程特性。本文主要介绍Python中,Python2和Python3面向对象中的类的区别、继承等区别,以及相关的示例代码。

1、类的区别

经典类:在Python2中,class Person: 不会继承object,这样的类叫做经典类(它叫经典类,不是因为它经典,而是因为它比较老)

新式类:在Python3中,Python会默认继承object类(一切皆对象)

class Person  就相当于Python2中的  class Person(object)  #新式类

另外,Python3中没有经典类。所有类都是新式类,无需显式继承 object

例如,

Python2:

class Person():             #经典类
    pass
class Teacher(object):      #新式类
    pass

Python3:

class Person():
pass
class Teacher(object):
pass
#这两个都是新式类

2、继承的区别

Python2经典类查找使用的深度优先。新式类会根据不同情况采用深度优先或广度优先。Python3中没有了经典类,查找方法跟Python2的新式类一样。

例如,

Python2: 

class Person():
    def fun(self):
        print "我是一个人"
class Coder():
    def fun(self):
        print "我是一个程序员"
class Teacher(Person):
    pass
class Levi(Teacher,Coder):
    pass
a=Levi()
a.fun()# 输出"我是一个人"

改成新式类,代码如下,

class Person(object):
    def fun(self):
        print "我是一个人"
class Coder(Person):
    def fun(self):
        print "我是一个程序员"
class Teacher(Person):
    pass
class Levi(Teacher,Coder):
    pass
a=Levi()
a.fun()# 输出 "我是一个程序员"

Python3:

class Person(object):
    def fun(self):
        print("我是一个人")
class Coder(Person):
    def fun(self):
        print("我是一个程序员")
class Teacher(Person):
    pass
class Levi(Teacher,Coder):
    pass
a=Levi()
a.fun()# 输出 "我是一个程序员"

3、super() 的变化

Python 2 的super() 函数的调用需要显式传递当前类和实例对象。

class BaseClass(object):
    def __init__(self):
        print("BaseClass init")

class DerivedClass(BaseClass):
    def __init__(self):
        super(DerivedClass, self).__init__()
        print("DerivedClass init")

Python 3 super() 调用时不再需要显式传递类和实例,简化了代码。

class BaseClass:
    def __init__(self):
        print("BaseClass init")

class DerivedClass(BaseClass):
    def __init__(self):
        super().__init__()
        print("DerivedClass init")

4、其它区别

1)Python3中迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法。

2)Python3增加了@abstractmethod@abstractproperty两个 decorator,编写抽象方法(属性)更加方便。

推荐文档