目錄python
什麼是面向對象?編程
面向對象是一種編程思想。函數
面向過程編程code
核心是「過程」二字,過程指的是作事情的步驟,即先作什麼,而後作什麼,最後作什麼。對象
基於該編程思想編寫程序,就相似於一條工廠流水線,一種機械式的思惟方式。it
優勢io
邏輯清晰,將複雜的問題流程化,進而簡單化。面向對象編程
缺點ast
可擴展性差。function
面向對象編程
核心是「對象」二字,對象指的是特徵與技能的結合體。
基於該編程思想編寫程序,就相似於在創造世界,一種上帝式的思惟方式。
優勢
可擴展性高。
缺點
編寫程序的複雜程度要遠高於面向過程編程思想。
優先使用面向過程仍是面向對象?
實際編程中須要面向過程結合面向對象一塊兒使用
什麼是對象
特徵和技能的結合體。
什麼是類
一系列對象相同的特徵與技能的結合體。
在現實世界中
對象是一個個具體存在的事物,類是由人類文明的發展抽象總結出來的。
在程序中
必須遵循,先有類,再由對象。
現實世界中,現有對象,後有類。
現實中的貓對象:
根據對象抽象出類:
程序中先定義類,再產生對象。
class 類名: 對象相同的特徵 對象相同的技能 # class: 用來定義類的,class後跟的是類名。 # 類名: 類的名字,用來調用創造對象的。 # 注意: 類名必需要遵循駝峯命名法,python在定義變量與函數時不推薦使用,但在定義類時推薦使用。
定義類時發生的事情:
類在定義時,會產生一個類的名稱空間
類內部的全部名字,都會存進名稱空間
注意:類在定義階段已經產生好了名稱空間,執行python文件時會執行類內部的代碼
定義一個類:
class Cat: att = 'cute' def catch(self): print('catch mouse.') def climb(self): print('climb up a tree.')
查看類的名稱空間內全部名字
print(Cat.__dict__)
運行結果:
{'__module__': '__main__', 'att': 'cute', 'catch': <function Cat.catch at 0x0000027ED1EB28C8>, 'climb': <function Cat.climb at 0x0000027EE0F3FB70>, '__dict__': <attribute '__dict__' of 'Cat' objects>, '__weakref__': <attribute '__weakref__' of 'Cat' objects>, '__doc__': None} Process finished with exit code 0
查
print(Cat.att)
運行結果:
cute
改
Cat.att='lovely' print(Cat.att)
運行結果:
lovely Process finished with exit code 0
增
Cat.master='tom' print(Cat.master)
運行結果:
tom Process finished with exit code 0
刪
Cat.master='tom' print(Cat.master) del Cat.master print(Cat.master)
運行結果:
tom Traceback (most recent call last): File "D:/data/python/Learn/courses/day19/01 課程內容/代碼/1 類.py", line 53, in <module> print(Cat.master) AttributeError: type object 'Cat' has no attribute 'master' Process finished with exit code 1
類名 + () 調用類產生對象。
定義對象發生的事情:
產生一個空的對象的名稱空間
會自動觸發 __init__
把對象自己以及括號內的參數一併傳給 __init__
函數
總結:調用類會產生一個對象,調用類的過程叫作類的實例化,產生的對象稱之爲類的一個實例。
實例化一個對象:
# 定義一個類 class Cat: att = 'cute' def catch(self): print('catch mouse.') def climb(self): print('climb up a tree.') # 實例化對象 cat1 = Cat() cat2 = Cat() # 查看對象屬性 print(cat1.att) cat1.catch() cat1.climb() print(cat2.att) cat2.catch() cat2.climb()
運行結果:
cute catch mouse. climb up a tree. cute catch mouse. climb up a tree. Process finished with exit code 0
方法:類定義階段定製屬性,使用 __init__
函數。
# 定義類 class Cat: def __init__(self, att, variety, age, weight): self.att = att self.varieties = variety self.age = age self.weight = weight def catch(self): print('catch mouse.') def climb(self): print('climb up a tree.') # 實例化對象時傳特徵 cat1 = Cat('cute', 'Orange Cat', 3, 10) cat2 = Cat('lovey', 'Dragen-Li', 2, 6) print(cat1.att, cat1.varieties, cat1.age, cat1.weight) print(cat2.att, cat2.varieties, cat2.age, cat2.weight)
運行結果:
cute Orange Cat 3 10 lovey Dragen-Li 2 6 Process finished with exit code 0
對象與類的查找順序:
class Cat: def __init__(self, name, att, variety, age, weight): self.name = name self.att = att self.varieties = variety self.age = age self.weight = weight def catch(self): print(f'{self.name}catch mouse.') def climb(self): print('climb up a tree.')
cat1 = Cat('lucky', 'cute', 'Orange Cat', 3, 10) cat2 = Cat('ball', 'lovey', 'Dragen-Li', 2, 6) print(cat1.name) print(cat2.name)
運行結果:
lucky ball Process finished with exit code 0
print(id(cat1.climb)) print(id(cat2.climb)) print(id(Cat.catch)) cat1.catch() cat2.catch()
運行結果:
1503122635976 1503122635976 1501259299696 lucky catch mouse. ball catch mouse. Process finished with exit code 0