Life Since 1985

Happy Hacking

python新式类的继承方式

最近在读《python学习手册》,发现python新式类的继承方式很有意思,而且据说在python3.0里面所有的类都将变成新式类,在此让同是跟我一样在Python2.x入门的人尝个鲜。

在python的普通中类中,继承的模式是深度优先的,也就是说对于一个对象的搜索遵循从左至右、从下到上的原则,而这从下到上的原则又优于从左至右。发觉语言上的描述十分晦涩,举个例子吧。

# -*- coding:utf-8 -*-
class A():
    """
    作为所有类的基类
    """
    value = 1
    
    def __init__(self, ):
        """
        """
        
class B(A):
    """
    D的基类,继承自A
    """
    
    def __init__(self, ):
        """
        """

class C(A):
    """
    D的基类,继承自A
    并且将基类中的变量值修改
    """
    value = 3
    
    def __init__(self, ):
        """
        """
        
class D(B, C):
    """
    """
    
    def __init__(self, ):
        """
        """
        
x = D()
print x.value

对于以上的代码输出的结果将是1。

因为对于经典类来说,在类D中调用对象value,首先要查找类D中是否有value,如果没有则按顺序查找B->A->C。它是一种广度优先的查找方式,所以首先会在基类A中查找到对象value,然后输出1。

以下是新式类的例子:

# -*- coding:utf-8 -*-
class A(object):
    """
    作为所有类的基类
    """
    value = 1
    
    def __init__(self, ):
        """
        """
        
class B(A):
    """
    D的基类,继承自A
    """
    
    def __init__(self, ):
        """
        """

class C(A):
    """
    D的基类,继承自A
    并且将基类中的变量值修改
    """
    value = 3
    
    def __init__(self, ):
        """
        """
        
class D(B, C):
    """
    """
    
    def __init__(self, ):
        """
        """
        
x = D()
print x.value

对于这个例子输出的结果将是3。

因为基类A继承于object,而所有继承于object的类都将是新式类。对于新式类来说,在类D中调用对象value,它首先查找的依然是类D。如果没有查找到的话,他会依次查找B->C->A。在我看来,它是一种按层查找的原则,会在较低层查找对象,如果没有的话再到较高层查找。所以对于这个例子来说,value在类C中被查找到,所以它的值将会是3。

这种继承方式的查找还是挺有意思的,我本人是比较喜欢新式类的继承方式,因为毕竟如果在继承类中有对于基类中对象的修改,那么这种修改应该是有意义的,而经典类的继承方式就有可能因为基类顺序的问题将这种有意义的修改屏蔽掉,所以还是新式类会比较好一些。而对于python语言的发展来说,python3.0以后所有的类继承方式都将是新式类的继承,也就说所有的类都将是新式类,所以这种继承方式也是我们有必要去掌握的。

python中文支持

在开头进行编码声明:

# -*- coding:gb2312 -*-

在声明之后就可以使用中文字符了,即便不用在字符串之前声明位unicode编码也不会出现乱码了。