1. 引言
在Python中,类有经典类和新式类之分。这两种类的区别在Python 3中并不明显,但在Python 2中却非常重要。本文将通过实例分析Python新式类和经典类的区别。
2. Python类的基本概念
在Python中,类是一种用户自定义的数据类型。它包含了数据属性和方法。数据属性是类的状态,而方法是类的行为。
在Python中,可以通过如下的语法来定义一个类:
class ClassName:
<statement-1>
.
.
.
<statement-N>
其中,statement是类的语句。在Python中,类必须以关键字class开头,后面紧跟着类的名称,名称通常以大写字母开头,用以和变量区分。在类定义之后紧跟着的是一个固定的语法结构,包含了类的属性和方法。
3. 经典类和新式类
3.1 经典类
经典类是Python 2中的一种类,也是默认的类类型。在经典类中,没有定义继承自object类。
以下是一个经典类的定义:
class MyClass:
def __init__(self, value):
self.value = value
def get_value(self):
return self.value
在Python 2中,如果要定义新式类,需要将类继承自object类。
3.2 新式类
在Python 2.2引入了新式类,它是继承自内置的object类的类。
以下是一个新式类的定义:
class MyClass(object):
def __init__(self, value):
self.value = value
def get_value(self):
return self.value
4. 区别分析
4.1 属性查找顺序不同
在经典类中,属性查找的顺序是自下而上、自左而右的,也就是说,如果在当前类中找不到某个属性,就会向上一级的父类中查找,一直到顶层的基类object为止。而在新式类中,属性查找的顺序是采用广度优先的算法,也就是说,先查找本类,再查找父类,再查找父类的父类,以此类推。
以下是一个经典类的继承示例:
class Animal:
def say(self):
return "Animal"
class Cat(Animal):
def say(self):
return "Cat"
class BlackCat(Cat):
pass
cat = BlackCat()
print cat.say()
以上代码输出的结果为:
Animal
结果是Animal,而不是我们想要的Cat。这是因为在经典类中,查找属性的顺序是自下而上、自左而右。由于BlackCat类中没有定义say方法,因此会查找父类Cat中是否有say方法,然后查找Animal类中是否有say方法。因为Animal类中有say方法,于是输出的结果就是Animal。
以下是一个新式类的继承示例:
class Animal(object):
def say(self):
return "Animal"
class Cat(Animal):
def say(self):
return "Cat"
class BlackCat(Cat):
pass
cat = BlackCat()
print cat.say()
以上代码输出的结果为:
Cat
结果是Cat,这是因为在新式类中,查找属性的顺序是广度优先。由于BlackCat类中没有定义say方法,因此会查找父类Cat中是否有say方法,然后查找Animal类中是否有say方法。因为Cat类中有say方法,于是输出的结果就是Cat。
4.2 super的用法不同
在经典类中,使用super函数时,需要将当前类和对象作为参数传递进去。而在新式类中,不需要传递当前类和对象,Python会自动处理。
以下是一个经典类中使用super函数的示例:
class A:
def __init__(self):
print "A init"
class B(A):
def __init__(self):
print "B init"
super(B, self).__init__()
class C(B):
def __init__(self):
print "C init"
super(C, self).__init__()
c = C()
以上代码输出的结果为:
C init
B init
A init
首先执行C的构造函数,然后执行B的构造函数,并调用A的构造函数。
以下是一个新式类中使用super函数的示例:
class A(object):
def __init__(self):
print "A init"
class B(A):
def __init__(self):
print "B init"
super().__init__()
class C(B):
def __init__(self):
print "C init"
super().__init__()
c = C()
以上代码输出的结果与经典类中的示例相同。
5. 总结
经典类和新式类的区别在Python 2中非常重要,在Python 3中已经没有太大的意义了。在实际开发中,建议使用新式类。
以上是Python新式类和经典类的区别实例分析。