Python 面向对象【1】
分裝 繼承 多態(tài)【不同對象對同一方法響應(yīng)不同行動】 類定義 class xxx: .... .... 類對象
類對象支持兩種操作:屬性引用和實(shí)例化
屬性引用 使用和 Python 中所有的屬性引用一樣的標(biāo)準(zhǔn)語法:類對象名.屬性名
類對象創(chuàng)建后,類命名空間中所有的命名都是有效屬性名。所以如果類定義是這樣:
?
class MyClass:? i = 12345 def f(self): return 'hello world' ?# 實(shí)例化類 x = MyClass() # 訪問類的屬性和方法 print("MyClass 類的屬性 i 為:", x.i) print("MyClass 類的方法 f 輸出為:", x.f())以上創(chuàng)建了一個新的類實(shí)例并將該對象賦給局部變量 x,x 為空的對象
執(zhí)行以上程序輸出結(jié)果為:
MyClass 類的屬性 i 為: 12345
MyClass 類的方法 f 輸出為: hello world
?
類有一個名為 __init__() 的特殊方法(構(gòu)造方法),該方法在類實(shí)例化時會自動調(diào)用,像下面這樣:
def __init__(self): self.data = []類定義了 __init__() 方法,類的實(shí)例化操作會自動調(diào)用 __init__() 方法。如下實(shí)例化類 MyClass,對應(yīng)的 __init__() 方法就會被調(diào)用:
x = MyClass()當(dāng)然, __init__() 方法可以有參數(shù),參數(shù)通過 __init__() 傳遞到類的實(shí)例化操作上。例如:
class Complex: def __init__(self, realpart, imagpart): self.r = realpart self.i = imagpart x = Complex(3.0, -4.5) print(x.r, x.i) ? ? ? ? ? ? ? ? ?? # 輸出結(jié)果:3.0 -4.5self代表類的實(shí)例,而非類
類的方法與普通的函數(shù)只有一個特別的區(qū)別——它們必須有一個額外的第一個參數(shù)名稱, 按照慣例它的名稱是 self。
class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()以上實(shí)例執(zhí)行結(jié)果為:
<__main__.Test instance at 0x100771878> __main__.Test從執(zhí)行結(jié)果可以很明顯的看出,self 代表的是類的實(shí)例,代表當(dāng)前對象的地址,而 self.class 則指向類
?
self 不是 python 關(guān)鍵字,我們把他換成xxx 也是可以正常執(zhí)行的:
class Test: def prt(xxx): print(xxx) print(xxx.__class__) t = Test() t.prt()以上實(shí)例執(zhí)行結(jié)果為:
<__main__.Test instance at 0x100771878> __main__.Test類的方法
在類的內(nèi)部,使用 def 關(guān)鍵字來定義一個方法,與一般函數(shù)定義不同,類方法必須包含參數(shù) self, 且為第一個參數(shù),self 代表的是類的實(shí)例?
class people:
??? #定義基本屬性
??? name = ''
??? age = 0
??? #定義私有屬性,私有屬性在類外部無法直接進(jìn)行訪問
??? __weight = 0
??? #定義構(gòu)造方法
??? def __init__(self,n,a,w):
??????? self.name = n
??????? self.age = a
??????? self.__weight = w
??? def speak(self):
??????? print("%s 說: 我 %d 歲。" %(self.name,self.age))
# 實(shí)例化類
p = people('jike',10,30) ? ? 【類的實(shí)例化操作會自動調(diào)用 __init__() 方法】
p.speak()
執(zhí)行以上程序輸出結(jié)果為:
jike 說: 我 10 歲。 繼承 class xxx(父類名): .... ....需要注意圓括號中父類的順序,若是基類中有相同的方法名,而在子類使用時未指定,python從左至右搜索
即方法在子類中未找到時,從左到右查找基類中是否包含方法。
?
父類必須與派生類定義在一個作用域內(nèi)。類定義在另一個模塊中時還可以用表達(dá)式
class 派生類名(模塊名.父類名):?舉例
?
執(zhí)行以上程序輸出結(jié)果為:
ken 說: 我 10 歲了,我在讀 3 年級多繼承
class 派生類名(Base1, Base2, Base3): .... ...需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索
即方法在子類中未找到時,從左到右查找父類中是否包含方法。
輸出:
我叫 Tim,我是一個演說家,我演講的主題是 Python
?
?
方法重寫
?
子類繼承父類構(gòu)造函數(shù)說明 類屬性與方法類的私有屬性【不能在外部調(diào)用】
__private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用時 self.__private_attrs。
類的方法
在類的內(nèi)部,使用 def 關(guān)鍵字來定義一個方法,與一般函數(shù)定義不同,類方法必須包含參數(shù) self,且為第一個參數(shù),self 代表的是類的實(shí)例。
self 的名字并不是規(guī)定死的,也可以使用 this,但是最好還是按照約定是用 self。
類的私有方法【不能在外部調(diào)用】
__private_method:兩個下劃線開頭,聲明該方法為私有方法,只能在類的內(nèi)部調(diào)用 ,不能在類的外部調(diào)用。self.__private_methods。
類的專有方法:
- __init__ : 構(gòu)造函數(shù),在生成對象時調(diào)用
- __del__ : 析構(gòu)函數(shù),釋放對象時使用
- __repr__ : 打印,轉(zhuǎn)換
- __setitem__ : 按照索引賦值
- __getitem__: 按照索引獲取值
- __len__: 獲得長度
- __cmp__: 比較運(yùn)算
- __call__: 函數(shù)調(diào)用
- __add__: 加運(yùn)算
- __sub__: 減運(yùn)算
- __mul__: 乘運(yùn)算
- __truediv__: 除運(yùn)算
- __mod__: 求余運(yùn)算
- __pow__: 乘方
?
# 各種運(yùn)算符重載
反向運(yùn)算符重載:
- __radd__:?加運(yùn)算
- __rsub__:?減運(yùn)算
- __rmul__:?乘運(yùn)算
- __rdiv__:?除運(yùn)算
- __rmod__:?求余運(yùn)算
- __rpow__:?乘方
復(fù)合重載運(yùn)算符:
- __iadd__:?加運(yùn)算
- __isub__:?減運(yùn)算
- __imul__:?乘運(yùn)算
- __idiv__:?除運(yùn)算
- __imod__:?求余運(yùn)算
- __ipow__:?乘方
#?關(guān)于 __name__
#?類的靜態(tài)方法、普通方法、類方法
?
?
pass ---占位符,表示稍后輸入如果子類定義與父類同名的方法或?qū)傩?#xff0c;會自動覆蓋父類的方法或?qū)傩?/strong> 子類覆蓋父類方法時,若需要父類中該方法中的屬性,則要先調(diào)用父類該方法,獲得所需要的屬性,再重寫
1.調(diào)用未綁定的父類方法
該重寫方法第一行: 父類名.xxxx(self ---將子類對象傳入)
2.使用super函數(shù)
super().父類方法名() ---不需要給定任何父類的名字,自動一層層找出 默認(rèn)要求,類定義中,方法的第一個參數(shù)是self == this,表示不同對象調(diào)用該方法時,傳入一個該對象參數(shù),用以區(qū)別誰調(diào)用此方法 構(gòu)造方法:_init_(self) ---構(gòu)造方法,實(shí)例化對象的時候會自動調(diào)用它,默認(rèn)參數(shù)形式如上,此時不需要實(shí)例化的時候給與參數(shù),,,,_init_(self,name) ---此時需要給個參數(shù) xx=Yy(zz)
可以重寫此方法自定義初始化操作
轉(zhuǎn)載于:https://www.cnblogs.com/expedition/p/10693091.html
總結(jié)
以上是生活随笔為你收集整理的Python 面向对象【1】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 申请的信用卡不激活会怎么样?变成沉睡卡/
- 下一篇: 【记录一下】从0到1 我的python开