day6--面向對象初識
一面向過程與面向對象
面向過程:
流水線式的思維,順著流程進行下去,類似於代碼的堆疊,重視步驟
優點:不需要考慮太多東西,想到一個功能就寫一個功能,堆疊代碼
缺點:過程往往是先後執行的,要想變換功能或者增加功能,就要考慮重新堆疊大部分或者所有代碼了,牽一發而動全身
面向對象:
將事務分解成各個對象,可以給這個對象附加相應的功能,後面的東西一旦調用,這些功能或者方法也就自然的擁有了
優點:對象可擴展,並可以單獨修改,調用的地方會立刻顯現,我是一塊磚哪裏需要哪裏搬
缺點:無法預測出現問題的具體地方,對象和對象之間融合到一塊了,找出問題需要很長時間
面向對象在實際運用中還是很普遍的,將事務拆分成各個對象,大家可以分頭去做,往往進度比較快
面向對象的實現需要類和對象
二 類和對象
類:相當於一個模板,裏面有這個模板的函數,變量,屬性,方式方法等
對象:根據模板來創建,這樣自然而然對象就擁有了類裏面的東西
2.1 定義一個類
一個類的定義有其獨特的方式,類名首字母大寫,裏面定義的函數,其參數必須有self
例如:
class Person: #定義一個人類 role = ‘person‘ #人的角色屬性都是人 def walk(self): #人都可以走路,也就是有一個走路方法 print("person is walking...") print(Person.role) #查看人的role屬性print(Person.walk) #引用人的走路方法,註意,這裏不是在調用
2.2實例化
類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征
例如:
class Person: #定義一個人類 role = ‘person‘ #人的角色屬性都是人 def __init__(self,name): self.name = name # 每一個角色都有自己的昵稱; def walk(self): #人都可以走路,也就是有一個走路方法 print("person is walking...") print(Person.role) #查看人的role屬性 print(Person.walk) #引用人的走路方法,註意,這裏不是在調用
實例化的過程就是類——>對象的過程
2.3類的屬性
dir(類名):查出的是一個名字列表 類名.__dict__:查出的是一個字典,key為屬性名,value為屬性值 二:特殊的類屬性 類名.__name__# 類的名字(字符串) 類名.__doc__# 類的文檔字符串 類名.__base__# 類的第一個父類(在講繼承時會講) 類名.__bases__# 類所有父類構成的元組(在講繼承時會講) 類名.__dict__# 類的字典屬性 類名.__module__# 類定義所在的模塊 類名.__class__# 實例對應的類(僅新式類中)View Code
2.4類的查看
類的兩種變量:靜態變量和動態變量
例如:
class Person: # class 關鍵字,定義了一個類 ‘‘‘ 類裏面的所有內容 ‘‘‘ animal = ‘高級動物‘ # 靜態變量 soup = ‘有思想‘ # 靜態變量 def __init__(self,name,sex,eye,high,weight,): # 構造方法 self.eye = eye # 屬性 self.name = name self.sex = sex self.high = high self.weight = weight print(666) def work(self): # 動態變量,動態方法,方法 print(self) # self.job = ‘IT‘ print(‘人會工作....‘)View Code
1,類名.__dict__方法 只能查看,不能增刪改。
# print(Person.__dict__)
# print(Person.__dict__[‘animal‘])
#查詢動態變量
print(Person.__dict__[‘work‘](11))
2 類名.變量名 可增刪改查
# print(Person.animal)
# print(Person.soup)
# Person.kind = ‘有性格‘
# Person.animal = ‘低等動物‘
# del Person.kind
查詢動態變量
#Person.work(11)
2.5對象的查看
實例化一個對象內部進行了三步
# 內部進行三步: # 1,實例化一個對象,在內存中產生一個對象空間。 # 2,自動執行init方法,並將這個空間對象。 <__main__.Person object at 0x0000000001F5ABE0> 傳給self # 3,通過構造方法裏的代碼給空間對象添加一些屬性,並返回給對象。View Code
對象的查看與類的查看類似,只是將類名換成了對象名
類的靜態屬性是共享給對象的,類的動態屬性是綁定給對象的
三面向對象的三大特性
3.1繼承
繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類
繼承簡單的來說就是子繼承父
繼承分為:單繼承和多繼承
一些對象具體相同的功能時,可以在它們的父類中實現,這樣的話可以減少很多代碼
註:除了子類和父類的稱謂,你可能看到過 派生類 和 基類 ,他們與子類和父類只是叫法不同而已。
查看繼承
類名.__bases__ #__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類
如果沒有指定基類,python會默認繼承object類,object是所有python類的基類
例如:leiming.__bases__
#結果為 (<class ‘object‘>,)
有很多情況是一個子類往往有很多父類,這個是多繼承,它又是如何繼承的
1、Python的類可以繼承多個類,Java和C#中則只能繼承一個類
2、Python的類如果繼承了多個類,那麽其尋找方法的方式有兩種,分別是:深度優先和廣度優先
- 當類是經典類時,多繼承情況下,會按照深度優先方式查找
- 當類是新式類時,多繼承情況下,會按照廣度優先方式查找
經典類和新式類,從字面上可以看出一個老一個新,新的必然包含了跟多的功能,也是之後推薦的寫法,從寫法上區分的話,如果 當前類或者父類繼承了object類,那麽該類便是新式類,否則便是經典類。
class D:
def bar(self):
print ‘D.bar‘
class C(D):
def bar(self):
print ‘C.bar‘
class B(D):
def bar(self):
print ‘B.bar‘
class A(B, C):
def bar(self):
print ‘A.bar‘
a = A()
# 執行bar方法時
# 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去D類中找,如果D類中麽有,則繼續去C類中找,如果還是未找到,則報錯
# 所以,查找順序:A --> B --> D --> C
# 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
a.bar()
經典類多繼承
class D(object): def bar(self): print ‘D.bar‘ class C(D): def bar(self): print ‘C.bar‘ class B(D): def bar(self): print ‘B.bar‘ class A(B, C): def bar(self): print ‘A.bar‘ a = A() # 執行bar方法時 # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去C類中找,如果C類中麽有,則繼續去D類中找,如果還是未找到,則報錯 # 所以,查找順序:A --> B --> C --> D # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了 a.bar()新式類多繼承
待續。。。。。
day6--面向對象初識