1.類和例項
類是建立例項的模板,而例項是乙個個具體的物件,每個例項有自己的資料,且相互獨立互不影響;
方法是和例項繫結的函式,與普通函式不同,類的方法可以直接訪問例項的資料;
通過在例項上呼叫方法,就可以實現對例項內部資料的操作
和靜態語言不同,python允許對例項變數繫結任何資料,也就是說,對於兩個例項變數,雖然它們都是同乙個類的不同例項,但擁有的變數名稱都可能不同:
2. 訪問限制
class內部屬性如果不想讓外部直接訪問,可以在變數前加__(兩個下劃線),如__name,而_name、__name__等都是可以直接訪問的。
設定成私有變數不代表不能訪問,python直譯器在其前邊加上了類名,通過這種方式就可以進行訪問,如bob._student__name (bob是類student的例項)
3.繼承和多型:
繼承可以利用或重寫父類的方法。
當子類和父類都存在相同的run()
方法時,我們說,子類的run()
覆蓋了父類的run()
,在**執行的時候,總是會呼叫子類的run()
。這樣,我們就獲得了繼承的另乙個好處:多型。
這就是動態語言的「鴨子型別」,它並不要求嚴格的繼承體系,乙個物件只要「看起來像鴨子,走起路來像鴨子」,那它就可以被看做是鴨子。
python的「file-like object「就是一種鴨子型別。對真正的檔案物件,它有乙個read()
方法,返回其內容。但是,許多物件,只要有read()
方法,都被視為「file-like object「。許多函式接收的引數就是「file-like object「,你不一定要傳入真正的檔案物件,完全可以傳入任何實現了read()
方法的物件。
4.獲取物件資訊:
type(),types,dir(),isinstance(),getattr(),settattr(),hasattr()
總是優先使用isinstance()判斷型別,可以將指定型別及其子類「一網打盡」。
getattr(),settattr(),hasattr()可以判斷例項中是否存在相應變數、方法,並且可以填寫相應的變數和方法。
5.類屬性和例項屬性
例項可以通過bob.name 或setattr()等方式新增屬性,而類可以通過類內**增加屬性,如果類和例項屬性同名那優先呼叫例項的屬性。
#練習題 為了統計學生人數,可以給student類增加乙個類屬性,每建立乙個例項,該屬性自動增加:
class student(object):
count = 0
def __init__(self,name):
self.name = name
student.count = student.count+1 # 注意是類student.count而不是例項selt.count
a = student('bob')
print(student.count)
a = student('bob')
print(student.count)
a = student('bob')
print(student.count)
python 物件導向程式設計
新式類 class mynewobjecttype bases define mynewobjecttype class class suite經典類 沒有指定乙個父類,或者子類化的基本類沒有父類,就建立了乙個經典類 class mynewobjecttype define mynewobjectt...
Python物件導向程式設計
class mynewobjecttype bases define mynewobjecttype class class suite例項化 myfirstobject mynewobjecttype class mydatawithmethod object defprintfoo self p...
python物件導向程式設計
程式設計正規化 程式設計時程式設計師用特定的語法 資料結構 演算法組成的 在計算機上執行任務的過程。實現乙個任務有不同的方式,對這些不同的程式設計方式的特點進行歸納總結得出的程式設計方式類別,即為程式設計正規化。不同的程式設計正規化本質上代表對各種型別的任務採取的不同的解決問題的思路,兩種最重要的程...