和其它程式語言相比,python 在盡可能不增加新的語法和語義的情況下加入了類機制。
python中的類提供了物件導向程式設計的所有基本功能:類的繼承機制允許多個基類(多繼承),派生類可以覆蓋基類中的任何方法,方法中可以呼叫基類中的同名方法。
物件可以包含任意數量和型別的資料。
class classname:..
.
類例項化後,可以使用其屬性,實際上,建立乙個類之後,可以通過類名訪問其屬性。
類物件支援兩種操作:屬性引用和例項化。
屬性引用使用和 python 中所有的屬性引用一樣的標準語法:obj.name。
類物件建立後,類命名空間中所有的命名都是有效屬性名。所以如果類定義是這樣:
#!/usr/bin/python3
class myclass:
"""乙個簡單的類例項"""
i = 12345
def f(self):
return 'hello world'
# 例項化類
x = myclass()
# 訪問類的屬性和方法
print("myclass 類的屬性 i 為:", x.i)
print("myclass 類的方法 f 輸出為:", x.f())
類有乙個名為 __init__() 的特殊方法(構造方法),該方法在類例項化時會自動呼叫,像下面這樣:
def __init__(self):
self.data =
類定義了 __init__() 方法,類的例項化操作會自動呼叫 __init__() 方法。
當然, __init__() 方法可以有引數,引數通過 __init__() 傳遞到類的例項化操作上。
self代表類的例項,而非類
類的方法與普通的函式只有乙個特別的區別——它們必須有乙個額外的第乙個引數名稱, 按照慣例它的名稱是 self。
class test:
def prt(self):
print(self)
print(self.__class__)
t = test() #<__main__.test instance at 0x100771878>
t.prt() #__main__.test
從執行結果可以很明顯的看出,self 代表的是類的例項,代表當前物件的位址,而 self.class 則指向類。
self 不是 python 關鍵字,我們把他換成 runoob 也是可以正常執行的。但是一般使用self
在類的內部,使用 def 關鍵字來定義乙個方法,與一般函式定義不同,類方法必須包含引數 self, 且為第乙個引數,self 代表的是類的例項。
python 同樣支援類的繼承,派生類的定義如下所示:
class derivedclassname(baseclassname1):..
.
需要注意圓括號中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查詢基類中是否包含方法。
baseclassname(示例中的基類名)必須與派生類定義在乙個作用域內。除了類,還可以用表示式,基類定義在另乙個模組中時這一點非常有用:class derivedclassname(modname.baseclassname):
python同樣有限的支援多繼承形式,
class derivedclassname(base1, base2, base3):..
.
需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查詢父類中是否包含方法。
如果你的父類方法的功能不能滿足你的需求,你可以在子類重寫你父類的方法
class parent: # 定義父類
def mymethod(self):
print ('呼叫父類方法')
class child(parent): # 定義子類
def mymethod(self):
print ('呼叫子類方法')
c = child() # 子類例項
c.mymethod() # 子類呼叫重寫方法
super(child,c).mymethod() #用子類物件呼叫父類已被覆蓋的方法
super() 函式是用於呼叫父類(超類)的乙個方法。
__private_attrs:兩個下劃線開頭,宣告該屬性為私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時self.__private_attrs。
在類地內部,使用 def 關鍵字來定義乙個方法,與一般函式定義不同,類方法必須包含引數 self,且為第乙個引數,self 代表的是類的例項。
self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。
__private_method:兩個下劃線開頭,宣告該方法為私有方法,只能在類的內部呼叫 ,不能在類地外部呼叫。self.__private_methods。
class justcounter:
__secretcount = 0 # 私有變數
publiccount = 0 # 公開變數
def count(self):
self.__secretcount += 1
self.publiccount += 1
print (self.__secretcount)
counter = justcounter()
counter.count()
counter.count()
print (counter.publiccount)
print (counter.__secretcount) # 報錯,例項不能訪問私有變數
python同樣支援運算子過載,我們可以對類的專有方法進行過載
class vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return vector(self.a + other.a, self.b + other.b)
v1 = vector(2,10)
v2 = vector(5,-2)
print (v1 + v2)
以上**執行結果如下所示:vector(7,8) Python語言學習(八)
120 類的格式是 class 類名 注意類名是約定以大寫字母開頭 資料,需要給定初始值 def定義函式 在類中定義函式的時候需要在最開始加乙個預設引數self 使用時為 物件名 類名 使用函式是為 物件名.函式名 121 類的繼承,格式為 class 類名 父類名 如果沒有新的引數可以直接寫pas...
c語言學習筆記八
資料結構的概念 學這東西感覺一下又回到了十年前 資料結構 data structure 資料的組織方式 演算法 資料結構 程式 堆疊 後進先出 示例 include char stack 512 int top 0 void push char c char pull int is empty vo...
c語言學習筆記八
資料結構的概念 學這東西感覺一下又回到了十年前 資料結構 data structure 資料的組織方式 演算法 資料結構 程式 堆疊 後進先出 示例 include char stack 512 int top 0 void push char c char pull int is empty vo...