class 的繼承分類
單繼承鏈/無重疊的繼承鏈/有重疊的繼承鏈
class 的繼承演算法
深度優先演算法:
1. 把根節點壓入棧中
2.每次從棧中彈出乙個元素,搜尋所有在它下一級的元素,將這些元素壓入棧中,
3 重複1和2
c3演算法:公式:
l(object)=[object]
l(子類(父類1,.父類2))=[子類]+ merge(l(父類1,.父類2),[父類1,父類2])
merge演算法
1 第乙個列表的第乙個元素是後續列表的第乙個元素,或者後續列表中沒有再次出現,則將這個元素合併到最終的解析列表中,並從當前操作的所有列表中刪除
2. 如果不符合,則跳過此元素,查詢下乙個列表的第乙個元素,重複1的判斷規則
3. 如果最終無法把所有元素歸併到解析列表,則報錯
c3演算法例子:
import inspect
class d:
pass
# l(d(object))= [d] + merge(l(object),[object])
# = [d] +merge(l[object],[object])
# = [d,object] + merge(l, )
# = [d, object]
class b(d):
pass
#l(b(object))= [b]+ merge(l(d),[d])
# = [b]+ merge([d, object],[d])
# = [b]+ merge([d, object],[d])
# = [b,d]+ merge(['', object],[''])
# = [b,d]+ merge([object])
# = [b,d,object]+ merge()
# = [b,d,object]
class c(d):
pass
#l(c(object))= [c,d,object]
class a(b,c):
pass
#l(a)=[a]+merge(l(b),l(c),[b,c])
# =[a]+merge([b,d,object],[c,d,object],[b,c])
# =[a,b]+merge([d,object],[c,d,object],[c])
# =[a,b,c]+merge([d,object],[d,object])
# =[a,b,c,d]+merge([object],[object])
# =[a,b,c,d,object]
print(inspect.getmro(a))
結果:類的設計原則:
s: single responsibility principle 乙個類只負責一項職責
o: open closed principle ,對擴充套件開發,對修改關閉
l: liskov substitution principle 黎克特制替換原則 使用基類引用的地方必須能使用繼承類胡物件
i: inte***ce segregation principle 如果乙個類包含了過多的介面方法,面這些方法在使用過程中並非不可分割,那麼應當將他們分離
d: dependency inversion priciple 依賴倒置原則,高層模組不應該直接依賴底層模組,他們應該依賴抽象類或介面
1 classanimal:2 def __init__(self,name,age=1):3 self.name=name4 self.age=age5
6 defeat(self):7 print("%s在吃飯"%self)8
9 defplay(self):10 print("%s在玩"%self)11
12 defsleep(self):13 print("%s在睡覺"%self)14
15 defeat(self):16 print("%s在吃飯"%self)17
19 classperson(animal):20 def __init__(self,name,pets,age=1):21 super().__init__(name,age)22 self.pets=pets23
24 defyang_pets(self):25 for pet inself.pets:26 print("%s在養寵物"%self)27 pet.eat()28 pet.play()29 pet.sleep()30
31 defmake_pets_work(self):32 for pet inself.pets:33 print("%s在安排工作" %self)34 pet.work()35
36 def __str__(self):37 return "小朋友{},年齡是{} 現在".format(self.name, self.age)38
39 classcat(animal):40 defwork(self):41 print("%s在捉老鼠" %self)42
43 def __str__(self):44 return "寵物名字是{},年齡是{}".format(self.name,self.age)45
47 classdog(animal):48 defwork(self):49 print("%s在看門" %self)50
51 def __str__(self):52 return "寵物名字是{},年齡是{}".format(self.name, self.age)53
54 d=dog("小黑",18)55 c=cat("小紅",2)56 p=person("lh",[d,c],18)57 p.yang_pets()58 p.make_pets_work()
結果如下:
小朋友lh,年齡是18 現在在養寵物
寵物名字是小黑,年齡是18在吃飯
寵物名字是小黑,年齡是18在玩
寵物名字是小黑,年齡是18在睡覺
小朋友lh,年齡是18 現在在養寵物
寵物名字是小紅,年齡是2在吃飯
寵物名字是小紅,年齡是2在玩
寵物名字是小紅,年齡是2在睡覺
小朋友lh,年齡是18 現在在安排工作
寵物名字是小黑,年齡是18在看門
小朋友lh,年齡是18 現在在安排工作
寵物名字是小紅,年齡是2在捉老鼠
Python變數查詢LEGB原則
首先要知道python的基本資料型別分為2種,可變以及不可變型別。可變型別list dict set 不可變型別number tuple string 當python訪問變數值時,預設legb查詢原則,如果都找不到,則會丟擲nameerror 但是,作為對變數值進行修改,則會有兩種情況 a 10 d...
Python設計模式 設計原則
1.單一職責原則 每個類都只有乙個職責,修改乙個類的理由只有乙個 2.開放 封閉遠端 ocp 開放是指可拓展性好,封閉是指一旦乙個類寫好了,就盡量不要修改裡面的 通過拓展 繼承,重寫等 來使舊的類滿足新的需求,而不是修改乙個類裡面的 3.依賴倒轉原則 高層模組不應該依賴底層模組,兩個都應該依賴抽象 ...
設計模式(python) 程式設計原則
開放 封閉原則規定,類或物件及其方法對於擴充套件來說,應該是開放的,但是對於修改來說,應該是封閉的。簡單地說,這意味著當你開發軟體應用的時候,一定確保以通用的方式來編寫類或模組,以便每當需要擴充套件類或物件行為的時候不必修改類本身。相反,類的簡單擴充套件將有助於建立新的行為。例如,開放 封閉原則能夠...