Python学习笔记8-类的继承 、深度优先、广度优先

Python 类声明

语法: 

 

class  类名:
        类体

例:

 

#--encoding:utf-8--
#
class AddressBookEntity:
    myVersion=0.1
    def __init__(self,name,phone):
        self.name=name
        self.phone=phone
    def updatePhone(self,newPhone):
        self.phone=newPhone
        print 'update user\' phone :'+newPhone
        
tom=AddressBookEntity('Tom','158375599668')
jack=AddressBookEntity('Jack','18975662244')

print tom
print tom.name,tom.phone
print jack
print jack.name,jack.phone
tom.updatePhone('15000000000')
print tom.name,tom.phone

 

Python 类的继承

在ptyhon中类一个类是可以同时继承多个类,语法:

 

class 类名(父类1,父类2,...)
        类体


Python类继承之深度优先

 

python 支持多继承,但对与经典类和新式类来说,多继承查找的顺序是不一样的。

经典类:

 

class P1: 
     def foo(self):           
         print 'p1-foo' 
 
class P2 : 
     def foo(self): 
         print 'p2-foo' 

     def bar(self): 
         print 'p2-bar' 
 
class C1 (P1,P2): 
     pass  
 
class C2 (P1,P2): 
     def bar(self): 
         print 'C2-bar'   
 
class D(C1,C2): 
     pass 

 

d = D()
d.foo() # 输出 p1-foo 
d.bar() # 输出 p2-bar 

 

 

实例d调用foo()时,搜索顺序是 D => C1 => P1
实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

换句话说,经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。

Python类继承之广度优先

新式类:

 

class P1(object): 
     def foo(self):           
         print 'p1-foo' 
 
class P2(object):
     def foo(self): 
         print 'p2-foo' 

     def bar(self): 
         print 'p2-bar' 
 
class C1 (P1,P2): 
     pass  
 
class C2 (P1,P2): 
     def bar(self): 
         print 'C2-bar'   
 
class D(C1,C2): 
     pass 

 

    d=D() 
    d.foo() # 输出 p1-foo 
    d.bar() # 输出 c2-bar


实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1
实例d调用bar()时,搜索顺序是 D => C1 => C2
可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

 


 

posted @ 2016-01-05 16:31  Bodi  阅读(1718)  评论(0编辑  收藏  举报