標籤:instance sel dir 嚴格 int 直接 方式 增加 練習
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物件導向編程