Python基礎,面向對象
幾個名詞知識:
類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
實例變量:定義在方法中的變量,只作用於當前實例的類。
數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
方法:類中定義的函數。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關系(例圖,Dog是一個Animal)。
實例化:創建一個類的實例,類的具體對象。
對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
類定義語法格式如下:
# E:\Python36 # coding=GBK class classname: script……
類實例化後,可以使用其屬性,實際上,創建一個類之後,可以通過類名訪問其屬性。
類對象支持兩種操作:屬性引用和實例化。
例如:
# E:\Python36 # coding=GBK #類定義 class people: #定義基本屬性 name = ‘‘ age = 1 def f(self): return ‘hello world‘ # 實例化類 b = people() # 訪問類的屬性和方法 print("people類的屬性age為:", b.age) print("people類的方法f輸出為:", b.f())
執行以上程序輸出結果為:
people類的屬性age為: 1
people類的方法f輸出為: hello world
定義類的時候是可以定義為一個可以初始化的類,因此類可能會定義一個名為 __init__() 的特殊方法(就是所謂的構造方法),類的實例化操作會自動調用 __init__() 方法。
當然, __init__() 方法可以有參數,參數通過 __init__() 傳遞到類的實例化操作上。
例如:
# E:\Python36 # coding=GBK #類定義 class people: #定義基本屬性 name = ‘‘ age = 0 #定義構造方法,用於初始化 def __init__(self,n,a): self.name = n self.age = a if __name__ == ‘__main__‘: #實例化 p = people(‘jack‘,25) p.speak()
輸出結果為:jack 12
類的方法
在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數:
例如:
# E:\Python36 # coding=GBK #類定義 class people: #定義基本屬性 name = ‘‘ age = 0 #定義構造方法,用於初始化 def __init__(self,n,a): self.name = n self.age = a def speak(self): print("我叫%s,今年%d歲!" %(self.name,self.age)) p = people(‘jack‘,25) p.speak()
執行代碼輸出結果:我叫jack,今年25歲了!
繼承
在這裏我應用了模塊,模塊就是一個包含所有你定義的函數和變量的文件,其後綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數等功能。
寫一個類(student)來繼承類(people),people應用模塊引入的方式,如下:
# E:\Python36 # coding=GBK #引入模塊 from class_people import people as p #單繼承示例,繼承people class student(p): grade = ‘‘ def __init__(self,n,a,g): #調用父類的構函 p.__init__(self,n,a) self.grade = g #如果父類的方法滿足不了需求則重寫父類的方法 def speak(self): print("不對現在%d歲了,我在讀%s年級"%(self.age,self.grade)) s = student(‘jack‘,26,‘大學三‘) s.speak()
執行代碼輸出結果為:
我叫jack,今年25歲!
不對現在26歲了,我在讀大學三年級
多繼承
這裏再增加一個類
這裏有用到了一個知識點:__name__屬性
一個模塊被另一個程序第一次引入時,其主程序將運行。如果我們想在模塊被引入時,模塊中的某一程序塊不執行,我們可以用__name__屬性來使該程序塊僅在該模塊自身運行時執行。
例如:
class_people people p speaker(p): topic = (,n,a,t): p.(,n,a) .topic = t speak(): (%(.name,.age,.topic)) __name__ ==: s = speaker(,,) s.speak()
下面我們來寫一個多繼承的代碼:
# E:\Python36 # coding=GBK from class_student import student as t from class_speaker import speaker as s # 多繼承,繼承學生和演說家 class sample(t,s): a =‘‘ def __init__(self,n,a,g,t1): t.__init__(self,n,a,g) s.__init__(self,t1) # 重寫父類方法 def speak(self): print("暑假過後就是%s了,我還是一個演說家,我今天演講的主題是%s"%(self.grade,self.topic)) test = sample("jack",26,‘大四‘,"Python") test.speak() #方法名同,默認調用的是在括號中排前地父類的方法
執行代碼,運行結果為:
我叫jack,今年25歲了!
不對現在26歲了,我在讀大學三年級
暑假過後就是大四了,我還是一個演說家,我今天演講的主題是Python
有結果我們可以看出,類class_speaker中的方法並沒有運行,因此每個模塊都有一個__name__屬性,當其值是‘__main__‘時,表明該模塊自身在運行,否則是被引入。
Python基礎,面向對象