新式類和經典類得區別:
class classicclass():
pass
class newstyleclass(object):
pass
x1 = classicclass()
x2 = newstyleclass()
print x1.__class__, type(x1)
print x2.__class__, type(x2)
輸出結果:
__main__.classicclass
經典類的繼承是深度優先,新式類的繼承是廣度優先。
子類和派生的動機是為了節省開發的事件,更加便捷的進行相關的設計。
oop的更強大功能之一是能夠使用乙個已經定義好的類,擴充套件它或者對其進行修改,而不會影響系統中使用現有類得其他**片段。
ood允許類特徵在子孫類或子類中進行整合。這些子類從基類(或者稱作祖先類、超類)繼承他們得核心屬性。而且,這些派生可能會擴充套件到多代。
在乙個層次的派生關係中的相關類(或者是在類樹圖種垂直相鄰)是父類和子類關係。從同乙個父類派生出來得這些類(或者是在類樹中水平響鈴)是同胞關係。父類和所有高層類都被認為是祖先。
繼承描述了,基類的屬性如何「遺傳」給派生類。乙個子類可以繼承它的基類的任何屬性,不管是資料屬性還是方法。
對於類、函式\方法,還有模組來說,文件字串都是唯一的,所以特殊屬性__doc__不會從基類中繼承過來。、
繼承覆蓋方法:super()內建方法;
使用super()的漂亮指出在於,你不需要明確給出任何基類名字。。。,它都可以幫你幹了!使用super()的重點,使你不需要明確提供父類。這意味著如果你改變了類繼承關係,你只需要改一行**(class語句本身)而不必在大量**中去查詢所有被修改的那乙個類的名字。
多重繼承:
python和c++一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。
對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現:
經典類:
#! /usr/bin/python
# -*- coding:utf-8 -*-
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
if __name__ =='__main__':
d=d()
d.foo()
d.bar()
執行的結果:
p1-foo
p2-bar
將**例項,畫了乙個圖,方便理解:
從上面經典類的輸出結果來看,
例項d呼叫foo()時,搜尋順序是 d => c1 => p1,
例項d呼叫bar()時,搜尋順序是 d => c1 => p1 => p2
新式類:
#! /usr/bin/python
# -*- coding:utf-8 -*-
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
if __name__ =='__main__':
print d.__mro__ #只有新式類有__mro__屬性,告訴查詢順序是怎樣的
d=d()
d.foo()
d.bar()
執行的結果:
p1-foo
c2-bar
從上面新式類的輸出結果來看,
例項d呼叫foo()時,搜尋順序是 d => c1 => c2 => p1
例項d呼叫bar()時,搜尋順序是 d => c1 => c2
總結:新式類的搜尋方式是採用「廣度優先」的方式去查詢屬性。
python建立子類 python 建立子類
如果你的類沒有從任何祖先類派生,可以使用object作為父類的名字。經典類的宣告唯一不同之處在於其 沒有從祖先類派生 此時,沒有圓括號 usr bin env python coding utf 8 class classicclasswithoutsuperclasses def fun1 sel...
python 子類關係
說明 python為所有類提供乙個 bases 屬性,通過該屬性可以檢視該類的所有直接父類,該屬性返回所有直接父類組成的元組 python為所有類提供了乙個 subclasses 方法,通過該方法可以檢視該類的所有直接子類,該方法返回該類的所有子類組成的列表 子類繼承父類的私有方法重寫無效,公有方法...
python學習筆記 子類
class car def init self,make,model,year self.make make self.model model self.year year 設定預設值 self.odometer reading 0 def get descriptive name self lon...