面向物件之類與物件
阿新 • • 發佈:2020-09-14
一、什麼是面向物件程式設計
核心是“物件”二字,物件指的是“特徵與技能”的結合體。
基於該程式設計思想編寫程式,就好比在創造世界,一種 “上帝式” 的思維方式。
優點:可擴充套件性強
缺點:程式設計的複雜度遠高於面向過程
應用場景:需求經常變化的軟體,一般需求的變化都集中在使用者層,網際網路應用,企業內部軟體,遊戲等都是面向物件的程式設計大顯身手的好地方
二、類與物件
類即類別、種類,是面向物件設計最重要的概念。物件是特徵與技能的結合體,而類則是一系列物件相同的特徵與技能的結合體
那麼問題來了,先有的一個個具體存在的物件(比如一個具體存在的人),還是先有的人類這個概念,這個問題需要分兩種情況去看
從兩種角度:
-現實世界中:
先有物件,然後隨著人類文明的發展,人類站在不同的角度總結出了不同的種類,如人類、動物類、植物類等概念。物件是具體存在的,而類只是一種抽象概念。
-在程式中:
務必保證先定義類,再通過“呼叫類,產生物件”。
在程式中,務必保證:先定義(類),後使用(產生物件) PS: 1. 在程式中特徵用變數標識,技能用函式標識 2. 因而類中最常見的無非是:變數和函式的定義 #程式中的類 定義類的命名規範:駝峰體 class BjdxStudent: #類名指向的是類的記憶體地址 #用變量表示特徵,在類中的特徵 也稱之為 “屬性” attributeschool = 'Bjdx' #用函式表示技能 #注意: 在類內部定義函式,會預設有一個引數self def learn(self): #self此時當做一個形參 print('is learning...') print(BjdxStudent) # <class '__main__.BjdxStudent'> ''' 注意:在定義類的階段會立刻執行類體內的程式碼,然後將產生的名字存放於類的名稱空間中 ''' #檢視類的名稱空間 print(BjdxStudent.__dict__) print(BjdxStudent.__dict__['school']) print(BjdxStudent.__dict__['learn']) BjdxStudent.__dict__['learn'](123) 類提供一種特殊獲取名字的方式 “類名.名字” 的方式 # 查 print(BjdxStudent.school) #Bjdx print(BjdxStudent.learn) #函式的記憶體地址 呼叫類裡面的函式的時候必須要傳參,如下: BjdxStudent.learn('tank') #此時learn裡面必須要加引數。 #is learning... # 改 BjdxStudent.school = 'beijing' print(BjdxStudent.school) #beijing # 刪 del BjdxStudent.school # 增 BjdxStudent.school = 'Bjdx' print(BjdxStudent.school) #bjdx BjdxStudent.bjdx_student = 'BH' #重點 print(BjdxStudent.bjdx_student) #BH print(BjdxStudent.__dict__) #類的名稱空間裡裡面多了 'bjdx_student': 'BH' ''' 注意區別: - 函式的名稱空間: 在呼叫函式時產生,函式呼叫結束後銷燬。 - 類的名稱空間: 在定義階段時產生,會將類中所有的名字,扔進類的名稱空間中。 '''
三、物件的產生
在程式中:必須呼叫類產生物件
類名+() 即呼叫類,產生物件
類的例項化:呼叫類的過程稱之為類的例項化,產生的物件也可以稱之為類的一個例項。
class Student: school = 'bjdx' def learn(self): print(self) print('learning...') stu1 = Student() stu2 = Student() stu3 = Student() print(stu1) #<__main__.Student object at 0x0000025C4BC52548> print(stu2) #<__main__.Student object at 0x0000025C4BC537C8> print(stu3) #<__main__.Student object at 0x0000025C4BC5CE88>
四、物件繫結方法的特殊之處
class BjdxStudent: school = 'bjdx' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def learn(self): print('%s is learning...' %self.name) stu1 = BjdxStudent('李三胖',18,'male') stu2 = BjdxStudent('王大炮',20,'male') print(BjdxStudent.learn) print(stu1.learn) print(stu2.learn) #三者的記憶體地址都不一樣 >>> function BjdxStudent.learn at 0x0000021CB0AAC9D8> >>> <bound method BjdxStudent.learn of <__main__.BjdxStudent object at 0x0000021C999D0508>> >>> <bound method BjdxStudent.learn of <__main__.BjdxStudent object at 0x0000021C999D75C8>> 1.類內部定義的函式,類可以使用,但類來用的時候就是一個普通函式,普通函式有幾個引數,就傳幾個引數 print(BjdxStudent.learn) BjdxStudent.learn(123) 2.類內部定義的函式,其實是給物件使用的,而且是繫結給物件用,繫結給不同的物件就是不同的繫結方法。 print(stu1.learn) #BjdxStudent.learn(stu1) print(stu2.learn) #BjdxStudent.learn(stu2) 3.繫結方法的特殊之處在於,誰來呼叫,就會將誰當作第一個引數自動傳入 stu1.learn() #李三胖 is learning... stu2.learn() #王大炮 is learning...
總結:
1.檢視類與物件的名稱空間 類.dict物件.dict
2.類中資料屬性(類中的變數): 類中屬性是給物件共享的,物件引用類中的屬性,指向的都是類中同一個記憶體地址。
3.類中的方法(類中的函式): 類中的方法是給物件使用的。
由不同的物件來呼叫就會將方法繫結給不同的物件, 並且會將物件當做第一個引數傳入。