Python2与Python3的区别及super函数的使用

1. Python2与Python3的区别

Python2和Python3是Python语言的两个主要版本,它们在语法和一些功能上有一些区别。本文将介绍一些主要的区别以及如何在两个版本之间进行转换。

1.1 打印函数

在Python2中,使用print语句进行输出,而在Python3中,print被改为了函数的形式。例如,在Python2中,我们可以这样打印一条简单的信息:

print "Hello World"

而在Python3中,我们需要使用以下格式:

print("Hello World")

1.2 整数的除法

在Python2中,两个整数相除的结果是一个整数,即执行的是地板除法(floor division)。而在Python3中,两个整数相除的结果是一个浮点数,即执行真除法(true division)。

# Python2
print 5 / 2 # 输出2

# Python3
print(5 / 2) # 输出2.5

如果你想在Python2中执行真除法,可以使用from __future__ import division导入future模块来实现。

1.3 Unicode字符串

在Python2中,字符串默认是ASCII编码,如果要使用Unicode字符串,则需要在字符串前面添加一个前缀u。而在Python3中,默认字符串是Unicode字符串,不需要添加前缀。

# Python2
str1 = u"Hello World"

# Python3
str2 = "Hello World"

1.4 xrange函数

在Python2中,有一个名为xrange的函数,用于生成一个迭代器,可以在循环中使用。而在Python3中,xrange被改名为range

# Python2
for i in xrange(5):
    print(i)

# Python3
for i in range(5):
    print(i)

1.5 异常处理

在Python2中,异常处理的语法为except ExceptionType, e,其中e是捕获到的异常对象。而在Python3中,异常处理的语法为except ExceptionType as e

# Python2
try:
    # some code that may raise an exception
except ValueError, e:
    # handle the ValueError exception

# Python3
try:
    # some code that may raise an exception
except ValueError as e:
    # handle the ValueError exception

2. super函数的使用

super是一个内置函数,用于调用父类的方法。在多重继承的场景下,使用super可以更加方便地调用父类的方法。

2.1 单继承中的super函数

在单继承的情况下,super函数可以直接调用父类的方法,无需指定父类的名称。

class Parent(object):
    def __init__(self):
        self.name = "Parent"
    
    def print_name(self):
        print(self.name)

class Child(Parent):
    def __init__(self):
        super().__init__() # 调用父类的构造函数
        self.name = "Child"

    def print_name(self):
        super().print_name() # 调用父类的方法
        print("Child")

child = Child()
child.print_name()

上述代码中,子类Child继承了父类Parent的方法和属性,并通过super函数调用了父类的构造函数和打印名称的方法。运行结果为:

Parent
Child

2.2 多继承中的super函数

在多继承的情况下,super函数的顺序是根据类的继承顺序决定的,称为"类的解析顺序"或"MRO"(Method Resolution Order)。可以通过__mro__属性查看类的解析顺序。

class ParentA(object):
    def __init__(self):
        self.name = "ParentA"
    
    def print_name(self):
        print(self.name)

class ParentB(object):
    def __init__(self):
        self.name = "ParentB"
    
    def print_name(self):
        print(self.name)

class Child(ParentA, ParentB):
    def __init__(self):
        super().__init__() # 调用Parent