日常運用中,判斷乙個類內部是否含有某個方法,我們可以使用hasattr()方法,即:
hasattr
([類名]
,"[方法名]"
)
這裡我們可以通過使用isinstance()通過判斷該類是否為某個抽象基類的子類來判斷,該類是否含有某抽象基類所特有的方法。 另外,抽象基類在對強制子類重寫方法方面有著比尋常方法更為快捷的優勢,這裡,我們可以舉個例子來說明一下,具體有哪方面的優勢。
例:
定義父類cache,封裝crud方法,強制子類重寫方法,定義子類redis。
這裡,我們可以對比一下以下兩種方法。
方法1:
class
cache
(object):
defcrud
(self)
:raise notimplementederror
class
radis
(cache)
:pass
a=radis(
)a.crud(
)
執行結果:
d:\python3.
7.6\python.exe e:
/flask學習/fuxi.py
traceback (most recent call last)
: file "e:/flask學習/fuxi.py"
, line 7,in
a.crud(
) file "e:/flask學習/fuxi.py"
, line 3
,in crud
raise notimplementederror
notimplementederror
process finished with exit code 1
在這個方法中,我們使用了父類主動丟擲異常的方式來強制子類進行方法的重寫,否則就會報錯。
方法二:
import abc
class
cache
(metaclass=abc.abcmeta)
: @abc.abstractmethod
defcrud
(self)
:pass
class
redis
(cache)
:pass
a=redis(
)
執行結果:
d:\python3.
7.6\python.exe e:
/flask學習/fuxi.py
traceback (most recent call last)
: file "e:/flask學習/fuxi.py"
, line 8,in
a=redis(
)typeerror: can't instantiate abstract class
redis
with abstract methods crud
process finished with exit code 1
兩個結果都是成功地丟擲了異常,但是當我們去對比丟擲異常的具體執行程式的時候則不難發現,運用第一種方法丟擲的異常出現在了訪問該方法的時候,這個物件成功地被例項化了出來,但用第二種方法丟擲的異常則是出現在了將物件例項化地過程中,在我們日常編寫**的過程中,第二種方法無疑是最方便程式設計師在**的測試中發現問題所在,可以很大程度上提高我們**的編寫、糾錯效率。
isinstance()與type()
共同點:
isinstane()與type()都是可以判斷某個物件的所屬型別
不同點:
isinstance(a,b)返回布林值,重點在於判斷a是否為b類的所屬型別,其中包括了a的類可以是b的子類
type(a)返回值為型別,比如a=3,那麼返回的type(a)則是int。另外,我們使用is來判斷b是否是a的型別時,並不包括b是a的子類。
物件可以向上查詢,即可以訪問到類屬性,類不能向下查詢,即類不能訪問到例項屬性。
注意
當物件有例項屬性時,直接輸出例項屬性,沒有時才會向上查詢到類屬性中。即我們在使用物件修改該物件中類屬性的值時,並未真的修改
類屬性值,只是相當於將所寫的屬性值封裝進了該物件之中,類屬性值沒有變。
關於多繼承查詢,在python2.2版本前,我們使用的是dfs(深度優先演算法),在2.2以後,我們常用bfs(廣度優先演算法),另外,在面對複雜繼承結構時,如果我們不確定查詢順序,我們可以使用__mro__直接檢視繼承順序。
若想要在子類中呼叫父類屬性,我們可以使用下列兩種方法。
方法一:直接通過父類的類名呼叫,當然,呼叫時需注意註明父類的self屬性
方法二:使用super()方法呼叫父類屬性
上述兩種方法中,我們通常選用第二中程式設計方法,我們稱之為軟編碼,原因在於,這個方法中,父類的類名可以隨意更改,子類不受影響。
Python 零散知識
1.set 集合 2.格式化字串時 可以使用 元組 eg info zhangsan 18 print s 年齡是 d info 3.zip的 使用方法 a 1,2,3 b 4,5,6 c 4,5,6,7,8 zipped zip a,b 打包為元組的列表 1,4 2,5 3,6 zip a,c 元...
零散知識收集
success在介面com.opensymphony.xwork2.action中定義,另外同時定義的還有error,input,login,none。值得一提的是struts 2.0中的result不僅僅是struts 1.x中forward的別名,它可以實現除forward外的很激動人心的功能,...
C 零散知識
全域性變數的初始化時機 c 是在編譯期初始化,c 是在程式執行時,main 函式之前初始化.不使用中間變數實現 strlen int mystrlen const char str c 語言函式引數入棧順序為從右至左。具體原因為 c 方式引數入棧順序 從右至左 的好處就是可以動態變化引數個數。通過棧...