介面類:強制子類需要實父類中的某項方法(被abstractmethod裝飾的方法)// an highlighted block
class
myabc:''
'抽象基類,其中可能並沒有實際可呼叫的**,但定義了若干函式名,表示其子類應當也擁有這些函式方法'
'' def func1()
: pass
def func2()
: pass
class
myclass
(myabc):''
'繼承myabc的子類,根據規範,應當實現父類中的func1(),func2()方法,但並不強制'
'' def func1()
: pass
def func2()
: pass
python為弱型別語言,變數賦值操作無須指定型別,則多型在python中可以說是沒有多型,但處處是多型。// an highlighted block
from abc import abcmeta,abstractmethod
class
myabc
(classmethod=abcmeta):
'''抽象基類,其中可能並沒有實際可呼叫的**,但定義了若干函式名,表示其子類應當也擁有這些函式方法'
'' @abstractmethod
def func1()
: pass
@abstractmethod
def func2()
: pass
class
myclass
(myabc):''
'繼承myabc的子類,必須實現父類中的func1(),func2()方法,否則在例項化物件的時候將報錯'
'' def func1()
: pass
def func2()
: pass
查閱了一些網路資源,對python有一段多型解釋**如下:
上述**我並沒有發現任何關於多型的體現,可能是我理解不夠深,反而是再次學習了類的物件,及物件可以作為引數傳給其他函式,在函式內可以訪問物件的屬性等內容。// an highlighted block
class
dog(object)
: def __init__
(self, name)
: self.name = name
def game
(self)
("%s 蹦蹦跳跳的玩耍..."
% self.name)
class
xiaotiandog
(dog)
: def game
(self)
("%s 飛到天上去玩耍..."
% self.name)
class
person
(object)
: def __init__
(self, name)
: self.name = name
def game_with_dog
(self, dog)
("%s 和 %s 快樂的玩耍..."
%(self.name, dog.name)
) dog.
game()
wangcai =
dog(
"旺財"
)wangcai2 =
xiaotiandog
("飛天旺財"
)xiaoming =
person
("小明"
)xiaoming.
game_with_dog
(wangcai)
xiaoming.
game_with_dog
(wangcai2)
****
****
****
****
****
****下面為控制台輸出**
****
****
****
****
****
**小明 和 旺財 快樂的玩耍...
旺財 蹦蹦跳跳的玩耍...
小明 和 飛天旺財 快樂的玩耍...
飛天旺財 飛到天上去玩耍...
在廖雪峰的**中,發現一段對於多型比較靠譜的解釋:
對於乙個變數,我們只需要知道它屬於父類(parent)型別,無需確切地知道它的子型別,就可以放心地呼叫父類中的某一方法(func),而具體呼叫的func方法是作用在子類1的例項化物件,子類2的例項化物件還是子類3的例項化物件上,由執行時該物件的確切型別(子類1,子類2,子類3可用擁有不同的屬性,或方法重寫對應父類的func,但一定能執行,因為如果沒有實現自己的func,將直接呼叫父類的func)決定,這就是多型真正的威力;廣義封裝:類中__init__構造行數為物件新增屬性也可以視為封裝呼叫方只管呼叫,不管細節,而當我們新增一種子類時,只要確保func方法編寫正確(重寫父類func方法),不用管原來的**是如何呼叫的。這就是著名的「開閉」原則:
對擴充套件開放:允許新增子類;
對修改封閉:不需要修改父類的func及依賴於func的其他函式,如:
def twice_func():
func()
func()
狹義封裝:私有。私有成員:私有靜態字段,私有方法,私有物件屬性
私有通過 』__變數名『 來定義,只有在定義類的內部才能直接訪問私有變數
以上邏輯為:// an highlighted block
class
parent
: def __func
(self)
('in parent func'
) def __init__
(self)
: self.
__func()
class
son(parent)
: def __func
(self)
('in son func'
)son1 =
son()**
****
****
****
****
****
**下面為控制台輸出**
****
****
****
****
****
**'in parent func'
1、son類例項化乙個物件,預設執行本類__init__方法;
2、本類沒有__init__方法,呼叫父類的__init__方法,執行其中的**:
3、執行到self.__func(),即執行self._parent__func(),self仍然是son的例項化物件
4、從物件空間中尋找_parent__func(),並沒有
5、從本類(son)空間中尋找._parent__func(),並沒有
6、從父類(parent)空間中尋找._parent__func(),有,執行print(『in parent func』)
ps:『』__變數『』在類定義的時候已經在記憶體中轉化為『』_class__變數『』
發現python中的私有其實只是通過內部轉化變數名實現,通過以下**可以確認,所以在修改其他人的**的時候,務必不能直接使用『』_class__變數『』訪問,因為python的私有其實是一種規範,而不是強制性的。
以上邏輯為:// an highlighted block
class
parent
: def __func
(self)
('in parent func'
) def __init__
(self)
: self.
__func()
class
son(parent)
: def _parent__func
(self)::
('in son func'
)son1 =
son()**
****
****
****
****
****
**下面為控制台輸出**
****
****
****
****
****
**'in son func'
1、son類例項化乙個物件,預設執行本類__init__方法;
2、本類沒有__init__方法,呼叫父類的__init__方法,執行其中的**:
3、執行到self.__func(),即執行self._parent__func(),self仍然是son的例項化物件
4、從物件空間中尋找_parent__func(),並沒有
5、從本類(son)空間中尋找._parent__func(),son類中的函式名被改為_parent__func,找到,執行print(『in son func』)
產品新萌從0 1
產品?專案?產品助理 產品經理概念 1.什麼是產品?產品可以理解為是用來解決問題的東西,是乙個只知道開始點而不知道結束點的特殊專案,產品從過程上看,其實就是乙個專案加乙個專案組成的。通俗地講,是能帶來收益的東西。產品管理相對於專案管理是制定方向,設計方案,確定計畫的過程 2.什麼是專案?專案可以理解...
萌新python機器學習筆記
萌新python機器學習 剛看完線性回歸的推導公式迫不及待的想用python進行實驗 import numpy as np from sklearn import datasets import matplotlib.pyplot as plt x,y datasets.make regressio...
python 萌新勇士之路
征服內容 1.你目前需要哪些型別 2.變數的定義 3.關鍵字的了解 一 型別 型別有多少呢?我知道你會有疑問,但是目前不用了解那麼多 目前你知道 整型,浮點型,布林型 整型就是整數 進入程式設計環境 print 0,1 1 0 1 1 你看都是整型 print 6261691611169111611...