萌新PYTHON學習01

2021-09-13 22:15:21 字數 4702 閱讀 2570

// an highlighted block

class

myabc:''

'抽象基類,其中可能並沒有實際可呼叫的**,但定義了若干函式名,表示其子類應當也擁有這些函式方法'

'' def func1()

: pass

def func2()

: pass

class

myclass

(myabc):''

'繼承myabc的子類,根據規範,應當實現父類中的func1(),func2()方法,但並不強制'

'' def func1()

: pass

def func2()

: pass

介面類:強制子類需要實父類中的某項方法(被abstractmethod裝飾的方法)

// 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為弱型別語言,變數賦值操作無須指定型別,則多型在python中可以說是沒有多型,但處處是多型。

查閱了一些網路資源,對python有一段多型解釋**如下:

// an highlighted block

class

dog(object)

: def __init__

(self, name)

: self.name = name

def game

(self)

:print

("%s 蹦蹦跳跳的玩耍..."

% self.name)

class

xiaotiandog

(dog)

: def game

(self)

:print

("%s 飛到天上去玩耍..."

% self.name)

class

person

(object)

: def __init__

(self, name)

: self.name = name

def game_with_dog

(self, dog)

:print

("%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)決定,這就是多型真正的威力;

呼叫方只管呼叫,不管細節,而當我們新增一種子類時,只要確保func方法編寫正確(重寫父類func方法),不用管原來的**是如何呼叫的。這就是著名的「開閉」原則:

對擴充套件開放:允許新增子類;

對修改封閉:不需要修改父類的func及依賴於func的其他函式,如:

def twice_func():

func()

func()

廣義封裝:類中__init__構造行數為物件新增屬性也可以視為封裝

狹義封裝:私有。私有成員:私有靜態字段,私有方法,私有物件屬性

私有通過 』__變數名『 來定義,只有在定義類的內部才能直接訪問私有變數

// an highlighted block

class

parent

: def __func

(self)

:print

('in parent func'

) def __init__

(self)

: self.

__func()

class

son(parent)

: def __func

(self)

:print

('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)

:print

('in parent func'

) def __init__

(self)

: self.

__func()

class

son(parent)

: def _parent__func

(self)::

print

('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...