物件導向的三大特性:封裝、繼承、多型
今天就聊一下下繼承……
關於父類與子類繼承中,那些不得不說的事……
多繼承init
有乙個類,能夠實現我們需要的大部分功能,但是不能實現全部功能
如何能讓這個類來實現全部的功能呢?
① 直接修改這個類,在這個類中新增我們需要的功能
- 修改起來會比較麻煩,並且會違反ocp原則
② 直接建立乙個新的類
- 建立乙個新的模擬較麻煩,並且需要大量的進行複製貼上,會出現大量的重複性**
③ 直接從animal類中來繼承它的屬性和方法
- 繼承是物件導向三大特性之一
- 通過繼承我們可以使乙個類獲取到其他類中的屬性和方法
- 在定義類時,可以在類名後的括號中指定當前類的父類(超類、基類、super)
子類(衍生類)可以直接繼承父類中的所有的屬性和方法
通過繼承可以直接讓子類獲取到父類的方法或屬性,避免編寫重複性的**,並且也符合**ocp原則**
所以我們經常需要通過繼承來對乙個類進行擴充套件
開放封閉原則(ocp,open closed principle)是所有物件導向原則的核心。
軟體設計本身所追求的目標就是封裝變化、降低耦合,而開放封閉原則正是對這一目標的最直接體現。
其他的設計原則,很多時候是為實現這一目標服務的,例如以liskov替換原則實現最佳的、正確的繼承層次,就能保證不會違反開放封閉原則。
子類從父類中繼承了所有的屬性與方法,但是具體問題具體分析,可能以後子類中不適用某個方法
class
dog:
defbark
(self)
:print
('汪汪汪~~~'
)def
sleep
(self)
:print
('呼呼呼~~~'
)
重寫乙個同名方法與之覆蓋,而又不會影響父類中的原方法
class
dogmini
(dog)
:# class 子類名(父類名)
defbark
(self)
:# 如果dogmini不會』汪汪汪『地叫,這時候就可以採用方法的重寫,用乙個同名函式適配dogmini
print
('嗷嗚嗷嗚~~~'
)
class
shenxian
:# 神仙
deffei
(self)
:print
("神仙都會⻜"
)class
monkey
:# 猴
defchitao
(self)
:print
("猴⼦喜歡吃桃⼦"
)class
sunwukong
(shenxian, monkey)
:# 孫悟空是神仙, 同時也是⼀隻猴
pass
sxz = sunwukong(
)# 孫悟空
sxz.chitao(
)# 會吃桃⼦
sxz.fei(
)# 會⻜
ps:這其中存在乙個非常複雜的mro(method resolution order)問題,在此就不一一贅述,有興趣可以自己去看一下下
傳送門父類中的所有方法都會被子類繼承,包括特殊方法
class
dog:
def__init__
(self, name)
: self._name = name
defbark
(self)
:print
('汪汪汪~~~'
)def
sleep
(self)
:print
('呼呼呼~~~'
)
可以通過建立__init__
方法來初始化子類中定義的屬性,還可以進行屬性的拓展
class
dogmini
(dog)
:def
__init__
(self, name, age)
: self._name = name
self._age = age
也可以通過直接呼叫父類中的屬性 (不可拓展)
class
dogmini
(dog)
:def
__init__
(self, name)
: dog.__init__(self, name)
super()
可以用來獲取當前類的父類,並且super()返回物件呼叫父類方法時,不需要傳遞self
class
dog(animal)
:def
__init__
(self,name,age)
:super()
.__init__(name)
self._age = age
對於正則,這些你不可能不知道的!
export const phonereg 1 3 5 6 7 8 9 d 手機ex port cons tpas sreg a za z0 9 6,12 手機 export const passreg a za z0 9 手機e xpor tcon stpa ssre g a za z0 9 6,...
你可能不知道的東西
元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...
你可能不知道的const
眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...