Python学習ノート8-クラスの継承、深さ優先、広さ優先

2566 ワード

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でクラスの1つのクラスは、複数のクラスを同時に継承することができ、構文:
 
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=>C 1=>P 1インスタンスdがbar()を呼び出す場合、探索順序はD=>C 1=>P 1=>P 2である
すなわち、古典的なクラスの検索方法は、「左から右へ、深さを優先する」方法で属性を検索します.d自己にfooメソッドがあるかどうかを検索し、ない場合は最近の親C 1にメソッドがあるかどうかを検索し、ない場合はP 1でメソッドが見つかるまで上を検索し、検索が終了する.
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=>C 1=>C 2=>P 1インスタンスdがbar()を呼び出す場合、探索順序がD=>C 1=>C 2であることから、新式クラスの探索方式は「広さ優先」方式で属性を探索することであることがわかる.