總的來(lái)說(shuō)就是調(diào)用python或者框架的內(nèi)建/全局類,變量,函數(shù)獲取敏感信息/執(zhí)行敏感操作,做題時(shí)先明確題目環(huán)境再去官方文檔中查找全局變量,類,函數(shù)。
創(chuàng)新互聯(lián)主營(yíng)漳浦網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,漳浦h5小程序設(shè)計(jì)搭建,漳浦網(wǎng)站營(yíng)銷推廣歡迎漳浦等地區(qū)企業(yè)咨詢
返回當(dāng)前對(duì)象實(shí)例的類。
返回一個(gè)由當(dāng)前類父類構(gòu)成的元組,由于python允許多重繼承。
返回一個(gè)由當(dāng)前函數(shù)可以訪問(wèn)到的變量,方法,模塊組成的字典,不包含該函數(shù)內(nèi)聲明的局部變量。
in python2 func.func_globals is func.__globals__
返回一個(gè)由當(dāng)前類的所有子類構(gòu)成的列表。
python2中形如
的定義不會(huì)繼承于object對(duì)象,所以不能用__subclasses__()方法,但在python3中即使這樣聲明也會(huì)繼承于object。
返回一個(gè)由內(nèi)建函數(shù)函數(shù)名組成的列表。
返回一個(gè)由當(dāng)前類繼承鏈組成的元組。
返回索引為index的值。
利用字符串,列表,元組,字典,集合等基本對(duì)象獲取類,通過(guò)類獲取基本類object,通過(guò)object獲取敏感類對(duì)象。
創(chuàng)建file對(duì)象后以可通過(guò)read()/write()函數(shù)進(jìn)行文件讀寫。
在 object.__subclasses__()[59/139].__init__.__globals__['__builtins__'] 下儲(chǔ)存了一些函數(shù)可供調(diào)用。
既然可以使用if語(yǔ)句,同樣也可以使用類似盲注的方式,逐字爆破。
過(guò)濾了括號(hào),沒(méi)法用__subclassess__獲取子類,并且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__獲取全局變量。
類(Class): 用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。
類變量:類變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類變量定義在類中且在函數(shù)體之外。類變量通常不作為實(shí)例變量使用。
類有一個(gè)名為 __init__() 的特殊方法(構(gòu)造方法),該方法在類實(shí)例化時(shí)會(huì)自動(dòng)調(diào)用
self:self 代表的是類的實(shí)例,代表當(dāng)前對(duì)象的地址,而 self.class 則指向類。
類調(diào)用 Car.weight
實(shí)例化 car01=Car(5)
實(shí)例對(duì)象調(diào)用 car01.weght
我們?cè)跇?gòu)造類時(shí),Python3默認(rèn)我們繼承了object這個(gè)基類,我個(gè)人理解object就是個(gè)空的類,可以不用管為何要在括號(hào)中寫上object,這是Python3的特性,在python2中如果你沒(méi)有寫object的話不會(huì)默認(rèn)繼承了object這個(gè)基類。
同樣的我們自己希望繼承的父類只需要把objetc改為我們自己定義的類名即可。子類中可以擁有父類中所有的公有屬性和方法,但是可以通過(guò)在變量名前加下劃線使其變?yōu)樗接?,這樣子類就不可以訪問(wèn)父類中的成員了。
以下三個(gè)公交車類的父類均為客車類,我們可以寫一個(gè)funcs方法使得每次調(diào)用funcs方法時(shí),傳入不同的對(duì)象以執(zhí)行不同的func方法,具體實(shí)現(xiàn)如下:
主函數(shù) :
可以看到,我將小 汽車 實(shí)例化為帶有重量為5t的一個(gè)具體對(duì)象,將客車實(shí)例化為帶有重量為20t的一個(gè)具體對(duì)象,將三個(gè)公交車實(shí)例化為帶有重量為15t的一個(gè)具體對(duì)象.
如上圖所示,我每次在調(diào)用funcs方法時(shí)都傳入了一個(gè)實(shí)例化對(duì)象,funcs根據(jù)不同的對(duì)象執(zhí)行相應(yīng)的內(nèi)部方法。
@[toc]
全局只有一個(gè)實(shí)例
font color=#03a3e3 該實(shí)現(xiàn)方式在多線程場(chǎng)景下不安全
繼承其他類的類稱為派生類(derived class)
被其他類繼承的類稱為這些類的基類(base
class)
需要注意圓括號(hào)中基類的順序:font color=#03a3e3 從左到右搜索 font
多繼承會(huì)導(dǎo)致菱形 diamond關(guān)系:有至少一個(gè)基類可以從子類經(jīng)由多個(gè)繼承路徑到達(dá)
基類方法可能被多次調(diào)用
防止重復(fù)訪問(wèn),每個(gè)基類只調(diào)用一次
通過(guò)子類實(shí)例對(duì)象課調(diào)用父類已被覆蓋
慎用多繼承(二義性)
– 對(duì)已有的運(yùn)算符重新進(jìn)行定義,賦予其另一種功能,以適應(yīng)不同的數(shù)據(jù)類型
– 運(yùn)算符重載不能改變其本來(lái)寓意
– 運(yùn)算符重載只是一種 “語(yǔ)法上的方便” (sugar)
– 是一種函數(shù)調(diào)用的方式
首先來(lái)看一個(gè)函數(shù)間的調(diào)用
類方法:
執(zhí)行結(jié)果:
metaclass能有什么用處,先來(lái)個(gè)感性的認(rèn)識(shí):
1.1 在wiki上面,metaclass是這樣定義的:In object-oriented programming,
a metaclass is a class whose instances are classes.
Just as an ordinary class defines the behavior of certain objects,
a metaclass defines the behavior of certain classes and their instances.
也就是說(shuō)metaclass的實(shí)例化結(jié)果是類,而class實(shí)例化的結(jié)果是instance。我是這么理解的:
metaclass是類似創(chuàng)建類的模板,所有的類都是通過(guò)他來(lái)create的(調(diào)用 new ),這使得你可以自由的控制
創(chuàng)建類的那個(gè)過(guò)程,實(shí)現(xiàn)你所需要的功能。
當(dāng)然你也可以用函數(shù)的方式(下文會(huì)講)
4.1 用類的形式
4.1.1 類繼承于type, 例如: class Meta(type):pass
4.1.2 將需要使用metaclass來(lái)構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為Meta(繼承于type的類)
4.2 用函數(shù)的形式
4.2.1 構(gòu)建一個(gè)函數(shù),例如叫metaclass_new, 需要3個(gè)參數(shù):name, bases, attrs,
name: 類的名字
bases: 基類,通常是tuple類型
attrs: dict類型,就是類的屬性或者函數(shù)
4.2.2 將需要使用metaclass來(lái)構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為函數(shù)metaclas_new
5.1 basic
metaclass的原理其實(shí)是這樣的:當(dāng)定義好類之后,創(chuàng)建類的時(shí)候其實(shí)是調(diào)用了type的 new 方法為這個(gè)類分配內(nèi)存空間,創(chuàng)建
好了之后再調(diào)用type的 init 方法初始化(做一些賦值等)。所以metaclass的所有magic其實(shí)就在于這個(gè) new 方法里面了。
說(shuō)說(shuō)這個(gè)方法: new (cls, name, bases, attrs)
cls: 將要?jiǎng)?chuàng)建的類,類似與self,但是self指向的是instance,而這里cls指向的是class
name: 類的名字,也就是我們通常用類名. name 獲取的。
bases: 基類
attrs: 屬性的dict。dict的內(nèi)容可以是變量(類屬性),也可以是函數(shù)(類方法)。
所以在創(chuàng)建類的過(guò)程,我們可以在這個(gè)函數(shù)里面修改name,bases,attrs的值來(lái)自由的達(dá)到我們的功能。這里常用的配合方法是
getattr和setattr(just an advice)
下面實(shí)現(xiàn)python中在一個(gè)類中調(diào)用另一個(gè)類的函數(shù)方法
或者下面來(lái)一個(gè)號(hào)理解的例子
執(zhí)行結(jié)果:
先來(lái)介紹內(nèi)部類與外部類是什么?
看源碼解析:
內(nèi)部類調(diào)用外部類的類屬性和類方法
參考文獻(xiàn)1
參考文獻(xiàn)2
參考文獻(xiàn)3
Python面向?qū)ο缶幊讨^承與多態(tài)詳解
本文實(shí)例講述了Python面向?qū)ο缶幊讨^承與多態(tài)。分享給大家供大家參考,具體如下:
Python 類的繼承
在OOP(Object Oriented Programming)程序設(shè)計(jì)中,當(dāng)我們定義一個(gè)class的時(shí)候,可以從某個(gè)現(xiàn)有的class 繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。
我們先來(lái)定義一個(gè)class Person,表示人,定義屬性變量 name 及 sex (姓名和性別);
定義一個(gè)方法print_title():當(dāng)sex是male時(shí),print man;當(dāng)sex 是female時(shí),print woman。參考如下代碼:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex) # 子類繼承父類方法及屬性
May.print_title()
Peter.print_title()
而我們編寫 Child 類,完全可以繼承 Person 類(Child 就是 Person);使用 class subclass_name(baseclass_name) 來(lái)表示繼承;
繼承有什么好處?最大的好處是子類獲得了父類的全部屬性及功能。如下 Child 類就可以直接使用父類的 print_title() 方法
實(shí)例化Child的時(shí)候,子類繼承了父類的構(gòu)造函數(shù),就需要提供父類Person要求的兩個(gè)屬性變量 name 及 sex:
在繼承關(guān)系中,如果一個(gè)實(shí)例的數(shù)據(jù)類型是某個(gè)子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過(guò)來(lái)就不行(Peter 僅是 Person,而不是Child)。
繼承還可以一級(jí)一級(jí)地繼承下來(lái),就好比從爺爺?shù)桨职帧⒃俚絻鹤舆@樣的關(guān)系。而任何類,最終都可以追溯到根類object,這些繼承關(guān)系看上去就像一顆倒著的樹。比如如下的繼承樹:
isinstance() 及 issubclass()
Python 與其他語(yǔ)言不同點(diǎn)在于,當(dāng)我們定義一個(gè) class 的時(shí)候,我們實(shí)際上就定義了一種數(shù)據(jù)類型。我們定義的數(shù)據(jù)類型和Python自帶的數(shù)據(jù)類型,比如str、list、dict沒(méi)什么兩樣。
Python 有兩個(gè)判斷繼承的函數(shù):isinstance() 用于檢查實(shí)例類型;issubclass() 用于檢查類繼承。參見(jiàn)下方示例:
class Person(object):
pass
class Child(Person): # Child 繼承 Person
pass
May = Child()
Peter = Person()
print(isinstance(May,Child)) # True
print(isinstance(May,Person)) # True
print(isinstance(Peter,Child)) # False
print(isinstance(Peter,Person)) # True
print(issubclass(Child,Person)) # True
Python 類的多態(tài)
在說(shuō)明多態(tài)是什么之前,我們?cè)?Child 類中重寫 print_title() 方法:若為male,print boy;若為female,print girl
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
當(dāng)子類和父類都存在相同的 print_title()方法時(shí),子類的 print_title() 覆蓋了父類的 print_title(),在代碼運(yùn)行時(shí),會(huì)調(diào)用子類的 print_title()
這樣,我們就獲得了繼承的另一個(gè)好處:多態(tài)。
多態(tài)的好處就是,當(dāng)我們需要傳入更多的子類,例如新增 Teenagers、Grownups 等時(shí),我們只需要繼承 Person 類型就可以了,而print_title()方法既可以直不重寫(即使用Person的),也可以重寫一個(gè)特有的。這就是多態(tài)的意思。調(diào)用方只管調(diào)用,不管細(xì)節(jié),而當(dāng)我們新增一種Person的子類時(shí),只要確保新方法編寫正確,而不用管原來(lái)的代碼。這就是著名的“開閉”原則:
對(duì)擴(kuò)展開放(Open for extension):允許子類重寫方法函數(shù)
對(duì)修改封閉(Closed for modification):不重寫,直接繼承父類方法函數(shù)
子類重寫構(gòu)造函數(shù)
子類可以沒(méi)有構(gòu)造函數(shù),表示同父類構(gòu)造一致;子類也可重寫構(gòu)造函數(shù);現(xiàn)在,我們需要在子類 Child 中新增兩個(gè)屬性變量:mother 和 father,我們可以構(gòu)造如下(建議子類調(diào)用父類的構(gòu)造方法,參見(jiàn)后續(xù)代碼):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
若父類構(gòu)造函數(shù)包含很多屬性,子類僅需新增1、2個(gè),會(huì)有不少冗余的代碼,這邊,子類可對(duì)父類的構(gòu)造方法進(jìn)行調(diào)用,參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex) # 子類對(duì)父類的構(gòu)造方法的調(diào)用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
多重繼承
多重繼承的概念應(yīng)該比較好理解,比如現(xiàn)在需要新建一個(gè)類 baby 繼承 Child , 可繼承父類及父類上層類的屬性及方法,優(yōu)先使用層類近的方法,代碼參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female") # 繼承上上層父類的屬性
print(May.name,May.sex)
May.print_title() # 可使用上上層父類的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title() # 優(yōu)先使用上層類的方法
在對(duì)于python中類的使用上,我們分出了子類和父類兩種。對(duì)于這二者之間的關(guān)系,我們可以簡(jiǎn)單理解為繼承。不過(guò)python中加入了實(shí)例的討論,那么對(duì)于繼承后的子類來(lái)說(shuō),父類的實(shí)例是否被繼承又是我們所需要思考的問(wèn)題。下面我們就子類和父類進(jìn)行簡(jiǎn)單介紹,然后就二者之間的繼承關(guān)系重點(diǎn)分析。
1.概念
子類和父類主要描述的是類之間的繼承關(guān)系,即所屬關(guān)系。繼承的類可在被繼承的類的基礎(chǔ)上添加格外的參數(shù)和行為,新類稱為子類,擴(kuò)展類;被繼承的類稱為基類、父類或者超類。
2.繼承關(guān)系
子類與父類的關(guān)系是 “is” 的關(guān)系,如上 Cat 繼承于 Animal 類,我們可以說(shuō):
“A”是 Animal 類的實(shí)例,但,“A”不是 Cat 類的實(shí)例。
“C”是 Animal 類的實(shí)例,“C”也是 Cat 類的實(shí)例。
判斷對(duì)象之間的關(guān)系,我們可以通過(guò) isinstance (變量,類型) 來(lái)進(jìn)行判斷:
print('"A" IS Animal?', isinstance(A, Animal))
print('"A" IS Cat?', isinstance(A, Cat))
print('"C" IS Animal?', isinstance(C, Animal))
print('"C" IS Cat?', isinstance(C, Cat))
Python實(shí)現(xiàn)子類調(diào)用父類的方法
python和其他面向?qū)ο笳Z(yǔ)言類似,每個(gè)類可以擁有一個(gè)或者多個(gè)父類,它們從父類那里繼承了屬性和方法。如果一個(gè)方法在子類的實(shí)例中被調(diào)用,或者一個(gè)屬性在子類的實(shí)例中被訪問(wèn),但是該方法或?qū)傩栽谧宇愔胁⒉淮嬖冢敲淳蜁?huì)自動(dòng)的去其父類中進(jìn)行查找。
繼承父類后,就能調(diào)用父類方法和訪問(wèn)父類屬性,而要完成整個(gè)集成過(guò)程,子類是需要調(diào)用的構(gòu)造函數(shù)的。
子類不顯式調(diào)用父類的構(gòu)造方法,而父類構(gòu)造函數(shù)初始化了一些屬性,就會(huì)出現(xiàn)問(wèn)題
如果子類和父類都有構(gòu)造函數(shù),子類其實(shí)是重寫了父類的構(gòu)造函數(shù),如果不顯式調(diào)用父類構(gòu)造函數(shù),父類的構(gòu)造函數(shù)就不會(huì)被執(zhí)行,導(dǎo)致子類實(shí)例訪問(wèn)父類初始化方法中初始的變量就會(huì)出現(xiàn)問(wèn)題。
分享文章:python函數(shù)類的繼承 python類和繼承
網(wǎng)頁(yè)URL:http://aaarwkj.com/article32/doodpsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、網(wǎng)站內(nèi)鏈、用戶體驗(yàn)、外貿(mào)網(wǎng)站建設(shè)、ChatGPT
聲明:本網(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)