python 類(lèi)的基礎(chǔ)詳解與應(yīng)用
類(lèi)的定義
# class是定義類(lèi)的關(guān)鍵字,ClassName為類(lèi)的名稱(chēng) class ClassName: # 在這里寫(xiě)其他內(nèi)容 pass class ClassName(object): # 在這里寫(xiě)其他內(nèi)容 pass
這是一個(gè)最簡(jiǎn)單的類(lèi)定義,在python3后類(lèi)定義一般都會(huì)繼承object類(lèi),不過(guò)不繼承也沒(méi)有多大的問(wèn)題。
類(lèi)對(duì)象
類(lèi)對(duì)象也稱(chēng)實(shí)例
# 這就是創(chuàng)建了一個(gè)類(lèi)對(duì)象(實(shí)例),a是一個(gè)實(shí)例也是一個(gè)對(duì)象 a = ClassName()
變量
類(lèi)內(nèi)部里面有:類(lèi)變量,局部變量,實(shí)例變量
類(lèi)變量
類(lèi)變量:所有類(lèi)的實(shí)例化對(duì)象都同時(shí)共享類(lèi)變量,也就是說(shuō),類(lèi)變量在所有實(shí)例化對(duì)象中是作為公用資源存在的。
class ClassName(object): # 定義一個(gè)類(lèi)變量 name = "Tom"
類(lèi)方法的調(diào)用方式有 2 種,既可以使用類(lèi)名直接調(diào)用,也可以使用類(lèi)的實(shí)例化(對(duì)象)調(diào)用。可以通過(guò)類(lèi)名修改類(lèi)變量的值,并且修改后,會(huì)影響所有的實(shí)例化的對(duì)象。
# 直接通過(guò)類(lèi)名調(diào)用 print(ClassName.name) # 創(chuàng)建類(lèi)的實(shí)例(對(duì)象) a = ClassName() b = ClassName() // 通過(guò)類(lèi)的實(shí)例調(diào)用 print(a.name) print(b.name) ClassName.name = "Tim" print(a.name) print(b.name)
運(yùn)行結(jié)果為:
Tom
Tom
Tom
Tim
Tim
但如果實(shí)例的類(lèi)變量的值修改后,在通過(guò)類(lèi)名修改變量的值,不會(huì)影響這個(gè)實(shí)例的類(lèi)變量。
a = ClassName() b = ClassName() a.name = "asf" ClassName.name = "Pig" print(a.name) print(b.name) ClassName.name = "aaa" print(a.name) print(b.name)
運(yùn)行結(jié)果:
asf
Pig
asf
aaa
通過(guò)運(yùn)行結(jié)果可知,在對(duì)象a改變name值后,再調(diào)用Class Name.name = "Pig"
對(duì)象a的name變量值沒(méi)有改變
局部變量
局部變量:局部變量只定義在類(lèi)方法內(nèi),也只能在方法內(nèi)使用
class ClassName(object): # 這是一個(gè)方法 def function(self): # 這是一個(gè)局部變量 name = "Tom"
name定義在類(lèi)方法內(nèi),所以是局部變量,在外部是無(wú)法調(diào)用,只能在方法內(nèi)使用。
實(shí)例變量
實(shí)例變量:以self.變量名的方式定義的變量,稱(chēng)為實(shí)例變量(屬性)
class ClassName(object): # 這是一個(gè)實(shí)例變量 def function1(self): self.name = "Tom" def function2(self): print(self.name)
只作用于調(diào)用方法的對(duì)象,可以在其他方法內(nèi)調(diào)用。
className = ClassName() className.function()
運(yùn)行結(jié)果:
Tom
如果定義在__init__()
方法中的實(shí)例變量,可以同過(guò)只能通過(guò)對(duì)象名訪(fǎng)問(wèn)。
class ClassName(object): def __init__(): self.name = "Tom" className = ClassName() print(className.name)
運(yùn)行結(jié)果:
Tom
私有變量
__name
這就是私有變量,在變量前面加兩個(gè)_
,self.__name
也是私用變量,私有變量在類(lèi)外部無(wú)法直接進(jìn)行訪(fǎng)問(wèn)。
class ClassName(object): # 定義了一個(gè)私有類(lèi)變量 __name = "Tom" ClassName.__name
運(yùn)行結(jié)果:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-8-08830fea0534> in <module>
2 __name = "Tom"
3
----> 4 ClassName.__nameAttributeError: type object 'ClassName' has no attribute '__name'
類(lèi)的方法
在類(lèi)里面用def
關(guān)鍵字來(lái)定義方法,也叫函數(shù)。與普通方法的區(qū)別是,必須需要一個(gè)self
的參數(shù),self
代表類(lèi)自身
class ClassName(object): def function(self,a): pass
def
為定義函數(shù)的關(guān)鍵字,function
為函數(shù)的名稱(chēng),
特殊方法
1.__init__()
用來(lái)初始化類(lèi)的參數(shù)一般叫構(gòu)造方法
這個(gè)方法,我們一般類(lèi)都會(huì)用到。
class ClassName(object): def __init__(self): self.name = "aaa"
當(dāng)類(lèi)實(shí)例化時(shí),會(huì)自動(dòng)調(diào)用__init__
2.__call__()
將對(duì)象當(dāng)做函數(shù)時(shí)調(diào)用。
class ClassName(object): def __init__(self): self.name = "aaa" def __call__(self): print("aaa") c = ClassName() // 類(lèi)實(shí)例化,執(zhí)行了__init__()方法 c() //執(zhí)行了__call__()方法
3、__get__()
類(lèi)作為另一個(gè)類(lèi)的屬性時(shí)自動(dòng)調(diào)用
class ClassName: def __init__(self): pass def __get__(self,instance, owner): print("__get__調(diào)用了") class ClassName2: a = ClassName()
運(yùn)行結(jié)果:
__get__調(diào)用了
4、__new__()
是一種負(fù)責(zé)創(chuàng)建類(lèi)實(shí)例的靜態(tài)方法,且該方法會(huì)優(yōu)先 __init__()
初始化方法被調(diào)用。
。。。還有很多其他的類(lèi)特殊方法
繼承
繼承在生活中是獲得父輩的財(cái)產(chǎn),在編程語(yǔ)言中是獲得父類(lèi)的所有變量,方法。通過(guò)繼承從類(lèi)上衍生出新的類(lèi)
單繼承
簡(jiǎn)而言之,是繼承一個(gè)類(lèi),所繼承的類(lèi)為基類(lèi)(父類(lèi)),繼承者為子類(lèi)
# 父類(lèi) class A: pass # 子類(lèi),繼承了A類(lèi) class B(A): pass
上面是個(gè)簡(jiǎn)單的繼承,子類(lèi)在類(lèi)名后面的括號(hào)內(nèi)寫(xiě)要繼承的類(lèi)的名稱(chēng)。
# 父類(lèi) class A: name = "Tom" def getName(self): print("..") # 子類(lèi),繼承了A類(lèi) class B(A): pass b = B() print(b.name) b.getName()
運(yùn)行結(jié)果:
Tom
..
發(fā)現(xiàn)B類(lèi)沒(méi)有寫(xiě)什么變量和方法,卻調(diào)用了A類(lèi)的變量(屬性)和方法
當(dāng)然如果不想要父類(lèi)的某個(gè)變量或方法,可以重寫(xiě)這個(gè)變量或方法
# 父類(lèi) class A: name = "Tom" def getName(self): print("..") # 子類(lèi),繼承了A類(lèi) class B(A): def getName(self): print("bbb") b = B() print(b.name) b.getName()
運(yùn)行結(jié)果:
Tom
bbb
多繼承
多繼承從名稱(chēng)上來(lái)看,是繼承了多個(gè)類(lèi)
class A: pass class B: pass class C(A, B): pass
上面這個(gè)C類(lèi)同時(shí)繼承了A類(lèi),B類(lèi)
到此這篇關(guān)于python 類(lèi)的基礎(chǔ)詳解與應(yīng)用的文章就介紹到這了,更多相關(guān)python 類(lèi)內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。