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