9.5. 繼承

石拐網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
當(dāng)然,如果一種語(yǔ)言不支持繼承就,“類(lèi)”就沒(méi)有什么意義。派生類(lèi)的定義如下所示:
class DerivedClassName(BaseClassName):
命名 BaseClassName (示例中的基類(lèi)名)必須與派生類(lèi)定義在一個(gè)作用域內(nèi)。除了類(lèi),還可以用表達(dá)式,基類(lèi)定義在另一個(gè)模塊中時(shí)這一點(diǎn)非常有用:
class DerivedClassName(modname.BaseClassName):
派生類(lèi)定義的執(zhí)行過(guò)程和基類(lèi)是一樣的。構(gòu)造派生類(lèi)對(duì)象時(shí),就記住了基類(lèi)。這在解析屬性引用的時(shí)候尤其有用:如果在類(lèi)中找不到請(qǐng)求調(diào)用的屬性,就搜索基類(lèi)。如果基類(lèi)是由別的類(lèi)派生而來(lái),這個(gè)規(guī)則會(huì)遞歸的應(yīng)用上去。
派生類(lèi)的實(shí)例化沒(méi)有什么特殊之處: DerivedClassName() (示列中的派生類(lèi))創(chuàng)建一個(gè)新的類(lèi)實(shí)例。方法引用按如下規(guī)則解析:搜索對(duì)應(yīng)的類(lèi)屬性,必要時(shí)沿基類(lèi)鏈逐級(jí)搜索,如果找到了函數(shù)對(duì)象這個(gè)方法引用就是合法的。
派生類(lèi)可能會(huì)覆蓋其基類(lèi)的方法。因?yàn)榉椒ㄕ{(diào)用同一個(gè)對(duì)象中的其它方法時(shí)沒(méi)有特權(quán),基類(lèi)的方法調(diào)用同一個(gè)基類(lèi)的方法時(shí),可能實(shí)際上最終調(diào)用了派生類(lèi)中的覆蓋方法。(對(duì)于 C++ 程序員來(lái)說(shuō),Python 中的所有方法本質(zhì)上都是 虛 方法。)
派生類(lèi)中的覆蓋方法可能是想要擴(kuò)充而不是簡(jiǎn)單的替代基類(lèi)中的重名方法。有一個(gè)簡(jiǎn)單的方法可以直接調(diào)用基類(lèi)方法,只要調(diào)用: BaseClassName.methodname(self, arguments)。有時(shí)這對(duì)于客戶也很有用。(要注意只有 BaseClassName 在同一全局作用域定義或?qū)霑r(shí)才能這樣用。)
Python 有兩個(gè)用于繼承的函數(shù):
函數(shù) isinstance() 用于檢查實(shí)例類(lèi)型: isinstance(obj, int) 只有在 obj.__class__ 是 int 或其它從 int 繼承的類(lèi)型
函數(shù) issubclass() 用于檢查類(lèi)繼承: issubclass(bool, int) 為 True,因?yàn)?bool 是 int 的子類(lèi)。
然而, issubclass(float, int) 為 False,因?yàn)?float 不是 int 的子類(lèi)。
總的來(lái)說(shuō)就是調(diào)用python或者框架的內(nèi)建/全局類(lèi),變量,函數(shù)獲取敏感信息/執(zhí)行敏感操作,做題時(shí)先明確題目環(huán)境再去官方文檔中查找全局變量,類(lèi),函數(shù)。
返回當(dāng)前對(duì)象實(shí)例的類(lèi)。
返回一個(gè)由當(dāng)前類(lèi)父類(lèi)構(gòu)成的元組,由于python允許多重繼承。
返回一個(gè)由當(dāng)前函數(shù)可以訪問(wèn)到的變量,方法,模塊組成的字典,不包含該函數(shù)內(nèi)聲明的局部變量。
in python2 func.func_globals is func.__globals__
返回一個(gè)由當(dāng)前類(lèi)的所有子類(lèi)構(gòu)成的列表。
python2中形如
的定義不會(huì)繼承于object對(duì)象,所以不能用__subclasses__()方法,但在python3中即使這樣聲明也會(huì)繼承于object。
返回一個(gè)由內(nèi)建函數(shù)函數(shù)名組成的列表。
返回一個(gè)由當(dāng)前類(lèi)繼承鏈組成的元組。
返回索引為index的值。
利用字符串,列表,元組,字典,集合等基本對(duì)象獲取類(lèi),通過(guò)類(lèi)獲取基本類(lèi)object,通過(guò)object獲取敏感類(lèi)對(duì)象。
創(chuàng)建file對(duì)象后以可通過(guò)read()/write()函數(shù)進(jìn)行文件讀寫(xiě)。
在 object.__subclasses__()[59/139].__init__.__globals__['__builtins__'] 下儲(chǔ)存了一些函數(shù)可供調(diào)用。
既然可以使用if語(yǔ)句,同樣也可以使用類(lèi)似盲注的方式,逐字爆破。
過(guò)濾了括號(hào),沒(méi)法用__subclassess__獲取子類(lèi),并且config和self置空。查看 flask文檔
flask為jinja2模板提供了兩個(gè)函數(shù)get_flashed_messages()和url_for(),選擇任意一個(gè)函數(shù),構(gòu)造payload
{{url_for.__globals__}}
提交后看到回顯里有一個(gè)current_app屬性,構(gòu)造payload
{{url_for.__globals__.current_app.config}} 或者 {{url_for.__globals__.['current_app']['config']}}
即可獲取flag
給出一個(gè)ctftime上的wp
這個(gè)wp中的payload很長(zhǎng)是因?yàn)閟earch函數(shù)進(jìn)行了深度優(yōu)先搜索,利用request作為起點(diǎn)的payload也可以簡(jiǎn)化為
request._get_data_for_json.__globals__['current_app'].config['FLAG'] 。總之就是通過(guò)__globals__獲取全局變量。
類(lèi)(Class): 用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。
類(lèi)變量:類(lèi)變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類(lèi)變量定義在類(lèi)中且在函數(shù)體之外。類(lèi)變量通常不作為實(shí)例變量使用。
類(lèi)有一個(gè)名為 __init__() 的特殊方法(構(gòu)造方法),該方法在類(lèi)實(shí)例化時(shí)會(huì)自動(dòng)調(diào)用
self:self 代表的是類(lèi)的實(shí)例,代表當(dāng)前對(duì)象的地址,而 self.class 則指向類(lèi)。
類(lèi)調(diào)用 Car.weight
實(shí)例化 car01=Car(5)
實(shí)例對(duì)象調(diào)用 car01.weght
我們?cè)跇?gòu)造類(lèi)時(shí),Python3默認(rèn)我們繼承了object這個(gè)基類(lèi),我個(gè)人理解object就是個(gè)空的類(lèi),可以不用管為何要在括號(hào)中寫(xiě)上object,這是Python3的特性,在python2中如果你沒(méi)有寫(xiě)object的話不會(huì)默認(rèn)繼承了object這個(gè)基類(lèi)。
同樣的我們自己希望繼承的父類(lèi)只需要把objetc改為我們自己定義的類(lèi)名即可。子類(lèi)中可以擁有父類(lèi)中所有的公有屬性和方法,但是可以通過(guò)在變量名前加下劃線使其變?yōu)樗接校@樣子類(lèi)就不可以訪問(wèn)父類(lèi)中的成員了。
以下三個(gè)公交車(chē)類(lèi)的父類(lèi)均為客車(chē)類(lèi),我們可以寫(xiě)一個(gè)funcs方法使得每次調(diào)用funcs方法時(shí),傳入不同的對(duì)象以執(zhí)行不同的func方法,具體實(shí)現(xiàn)如下:
主函數(shù) :
可以看到,我將小 汽車(chē) 實(shí)例化為帶有重量為5t的一個(gè)具體對(duì)象,將客車(chē)實(shí)例化為帶有重量為20t的一個(gè)具體對(duì)象,將三個(gè)公交車(chē)實(shí)例化為帶有重量為15t的一個(gè)具體對(duì)象.
如上圖所示,我每次在調(diào)用funcs方法時(shí)都傳入了一個(gè)實(shí)例化對(duì)象,funcs根據(jù)不同的對(duì)象執(zhí)行相應(yīng)的內(nèi)部方法。
Python是一種解釋型、面向?qū)ο蟆?dòng)態(tài)數(shù)據(jù)類(lèi)型的高級(jí)程序設(shè)計(jì)語(yǔ)言。
Python從設(shè)計(jì)之初就已經(jīng)是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,正因?yàn)槿绱耍赑ython中創(chuàng)建一個(gè)類(lèi)和對(duì)象是很容易的。
python繼承是什么意思?
python繼承:即一個(gè)派生類(lèi)(derived class)繼承基類(lèi)(base class)的字段和方法。繼承也允許把一個(gè)派生類(lèi)的對(duì)象作為一個(gè)基類(lèi)對(duì)象對(duì)待。
例如,有這樣一個(gè)設(shè)計(jì):一個(gè)Dog類(lèi)型的對(duì)象派生自Animal類(lèi),這是模擬"是一個(gè)(is-a)"關(guān)系(例圖,Dog是一個(gè)Animal)。
相關(guān)推薦:《Python教程》以上就是小編分享的關(guān)于python繼承是什么意思的詳細(xì)內(nèi)容希望對(duì)大家有所幫助,更多有關(guān)python教程請(qǐng)關(guān)注環(huán)球青藤其它相關(guān)文章!
子類(lèi)調(diào)用父類(lèi)函數(shù)有以下方法:
直接寫(xiě)類(lèi)名調(diào)用
用 super(type, obj).method(arg)方法調(diào)用。
在類(lèi)定義中調(diào)用本類(lèi)的父類(lèi)方法,可以直接用super().method(arg)
1
2
3
4
5
6
7
8
9
class A:
def method(self, arg):
pass
class B(A):
def method(self, arg):
# A.method(self,arg) # 1
# super(B, self).method(arg) # 2
super().method(arg) # 3
網(wǎng)站名稱:python函數(shù)繼承教程,Python繼承
URL分享:http://chinadenli.net/article47/dsecshj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、建站公司、、網(wǎng)站排名、用戶體驗(yàn)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)