第七章面向對象 1、面向過程編程 核心是”過程“二字,過程指的是解決問題的步驟,即先乾什麼再乾什麼 基於該思想編寫程式就好比在編寫一條流水線,是一種機械式的思維方式 優點:複雜的問題流程化、進而簡單化 缺點:可擴展性差 2、面向對象 核心”對象“二字,對象指的是特征(變數)與技能(函數)的結合體 ...
第七章面向對象
1、面向過程編程 核心是”過程“二字,過程指的是解決問題的步驟,即先乾什麼再乾什麼 基於該思想編寫程式就好比在編寫一條流水線,是一種機械式的思維方式
優點:複雜的問題流程化、進而簡單化 缺點:可擴展性差
2、面向對象 核心”對象“二字,對象指的是特征(變數)與技能(函數)的結合體,需要創造出一個個的具體存在的對象,程式的執行就是由對象直接交互完成
優點:可擴展性強 缺點:編程的複雜度高於面向過程
7.1 類
7.11 定義類
1、類:對象是特征與技能的結合體,那類就是一系列對象相似的特征與技能的結合體
2、在現實世界中:一定先有對象,後來隨著人類文明的發展總結出的類,對象是具體存在的,而類只是一種抽象概念
3、在程式中,務必保證:先定義類,後調用類來產生對象
class OldboyStudent: school="Oldboy" # 對象們相似的特征 def learn(self): # 對象們相似的技能 print('is learning...')
註意:在類定義階段就會立刻執行類體代碼,會產生類的名稱空間,將執行類體代碼過程中產生的名字存放於類的名稱空間
如何查看:
print(OldboyStudent.__dict__) # 查看類的名稱空間,以字典形式顯示 print(OldboyStudent.__dict__['school']) # Oldboy print(OldboyStudent.school) # Oldboy print(OldboyStudent.__dict__['learn']) #<function OldboyStudent.learn at 0x00000146F735BD90> print(OldboyStudent.learn) #<function OldboyStudent.learn at 0x00000146F735BD90> OldboyStudent.__dict__['learn'](123) # is learning... OldboyStudent.learn('xxx') # is learning... OldboyStudent.country='China' #增 OldboyStudent.school='偶的博愛' #改 del OldboyStudent.country #刪 print(OldboyStudent.__dict__)
7.12 調用類產生對象
class OldboyStudent: school="Oldboy" # 用變數表示特征 def __init__(self,name,age,sex): #self=stu1 name= "馬冬梅" age=18 sex="female" self.name=name # stu1.name = "馬冬梅" self.age=age # stu1.age = 18 self.sex=sex # stu1.sex = "female" def learn(self): # 用函數表示技能 print('is learning...',self) def choose(self): print('choose course...')
調用類發生哪些事:
1、首先會產生一個空對象stu1 2、會自動觸發類內部的__init__
函數 3、然後將空對象stu1連同調用類時括弧內的參數組成(stu1,"馬冬梅",18,'female'),將這四個參數一起傳給__init__
函數
初始化創建對象過程中,設置對象特征
stu1=OldboyStudent("馬冬梅",18,'female') # OldboyStudent.__init__(stu1,"馬冬梅",18,'female') stu2=OldboyStudent("甜蜜蜜",21,'male') # OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male') stu3=OldboyStudent("原石開",22,'male') print(stu1.name,stu1.age,stu1.sex) print(stu2.name,stu2.age,stu2.sex) print(stu3.name,stu3.age,stu3.sex)
初始化創建對象過程後,設置對象特征
stu1=OldboyStudent() stu1.NAME='馬冬梅' stu1.AGE=18 stu1.SEX="female" print(stu1.NAME,stu1.school)
調用類---》產生類的對象,該對象也可以稱為類的一個實例,調用類的過程也稱為類的實例化
7.13 類名稱空間和對象名稱空間
#school='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' class OldboyStudent: #school='oldboy' name='axaxaxaxxaaxs' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex stu1=OldboyStudent('李三胖',18,'male') #OldboyStudent.__init__(stu1,'李三胖',18,'male') print(stu1.name) #stu1對象的名稱空間和類的名稱空間都有name時優先自己的 #李三胖 print(stu1.school) #stu1對象的名稱空間沒有school時,到類的名稱空間查找 oldboy #類的名稱空間沒有時報錯
對象屬性的查找順序 : 先找對象自己的名稱空間----》類的名稱空間
7.14 綁定方法的特殊之處
class OldboyStudent: def learn(self): print('%s is learning' %self.name)
1.類內部定義的變數是給所有對象共用,所有對象指向的都是同一個記憶體地址
print(id(stu1.school)) # 2143429964384 print(id(stu2.school)) # 2143429964384 print(id(OldboyStudent.school)) # 2143429964384
2.類內部定義的函數,類可以使用,但類來用的時候就是一個普通函數,普通函數有幾個參就傳幾個參數
print(OldboyStudent.learn) #<function OldboyStudent.learn at 0x000001E46CA5CF28> OldboyStudent.learn(stu1) #李三胖 is learning
3.類內部定義的函數,其實是給對象使用的,而且是綁定給對象用,綁定給不同的對象就是不同的綁定方法,記憶體地址都不一樣,但其實指向同一個功能
print(stu1.learn)#<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x000001FC28E2BB38>> print(stu2.learn)#<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x000001FC28E2BB70>>
綁定方法的特殊之處在於:
1、 綁定給誰就應該由誰來調用 2、誰來調用就會把誰當做第一個參數傳入,但也可以有其他參數
stu1.learn() # OldboyStudent.learn(stu1) #李三胖 is learning stu2.learn() # OldboyStudent.learn(stu2) #王大炮 is learning
7.15 創建對象計數器
class Foo: n=0 def __init__(self): Foo.n+=1 # 不要寫成 self.n+=1 obj1=Foo() obj2=Foo() obj3=Foo() print(obj1.__dict__) # {} print(obj2.__dict__) # {} print(obj3.__dict__) # {} print(obj1.n) # 3 print(obj2.n) # 3 print(obj3.n) # 3View Code