面線物件之類與物件
一、面向物件:
面向物件是一種程式設計思想,即編寫程式碼的方式方法。
OOP(Object Oriented Programing)將程式看做是一堆物件的集合,實現功能的方式就是物件之間互動來實現。
二、類與物件:
1.面向物件思想中最核心的概念就是:物件與類。
定義:
什麼是物件:一切皆物件,物件指的是具備某些特徵和技能的集合體,是實實在在的存在的具體物體(我的手機是物件,手機不是物件是一個類)。
什麼是類:(類別,分類)類是一個抽象概念,是根據一些列具備相同特徵和技能的物件抽取得到的,比如說人類、鳥、花。通過類就能知道一個物件的特徵。
類與物件的關係:類包含了一些列相同特徵和技能的物件,物件是屬於類的例項。
在程式中是:先有類,才能通過類來產生物件,要先確定物件具備什麼特徵和什麼行為才能產生物件。
2.面向物件的優缺點:
優點:
1.不用考慮繁瑣的實現步驟,(從一個操作工,變成了老闆);
2.擴充套件性高,當需要一個新功能時,搞一個具備新功能的物件,命令它去完成任務;
3.各個物件之間耦合度較低,當一個物件出現了問題,不會對其他物件產生問題;
4.可維護性高。
缺點:
1.面向物件的複雜度比面向過程高。
2.無法預知執行結果,如王者榮耀的遊戲,一定不能把過程寫死,每個英雄的行為是不固定的。
使用場景:需要較高的擴充套件性(直接與使用者發生互動的程式對擴充套件性要求較高,如微信)
( 對於不需要擴充套件的程式而言,使用面向物件會增加複雜度。)
為什麼要用面向物件:在當前很多程式都需要與使用者直接打交道,使用者需求千變萬化,所以對擴充套件性要求特別高。
面向物件的本質:使用不同的物件來完成任務。
三、定義一個類:關鍵字class,+類名
class Penrson:
name=‘蓋倫’
類名的定義規範:類名要按照駝峰體書寫,如ThisIsPerson,即單詞首字母大寫。
如何得到一個物件:先定義一個類,在呼叫這個類並賦值給一個物件,就得到了一個物件。
訪問物件的屬性:用物件加點綴。
屬性查詢:
類有兩種屬性:資料性和函式屬性。
- 類的資料屬性是所有物件共享的。(所有物件共享的屬性的id是相同的)
- 類的函式屬性是繫結給物件用的。
每一個物件都對應著一個記憶體地址,在建立物件時,計算機會申請一個新的記憶體空間,並將物件中的內容存進去。由於name的值是申明在類中的,所以person1.name與person2.name的ID是相同的。
當所有物件的某個屬性都相同時,放在類中。
當每個物件的某個屬性不相同時,放到物件中。
可以通過 物件名.__dict__獲取物件的所有屬性,結果為字典型,但不包括類中的共享屬性。
通過 類名.__dict__獲取類中包含的所有屬性,包括類中定義的函式變數,函式等等資訊。
當物件中屬性不存在時,會去類中訪問,如果物件中存在這個屬性,會優先訪問物件中的屬性。即查詢順序為:先物件,後類。
當建立一個類、物件的時候 ,會產生一個名稱空間,儲存類、物件中名稱與值得繫結關係。
類還有一個作用:就是作為物件的模板,所有屬於該類的物件,都具備類中的公共內容。
即使類中,什麼都不寫,也存在一些自帶的屬性,是從父類中得到的。
四、初始化函式:(@classmethod)
定義一個函式,目的用於設定物件的屬性,如果沒有物件,這個函式就沒有意義,也就是初始化函式與類是一個整體。
物件一建立就應該進行初始化,所以最好的是將建立與初始化進行繫結。
初始化函式使用內建函式__init__(self,其他屬性引數),將該函式定義在類中,會在呼叫類時自動執行,(不需要呼叫__inint__,能自動執行。)self引數必須有,表示要進行初始化物件,系統會自動傳值。
五、繫結方法:是把物件與函式進行繫結。
1.為什麼要把方法與物件進行繫結:物件本質上是存放資料的容器,所以實質是把這個資料容器與函式進行繫結,函式的作用是實現功能即處理資料得到結果。
只要拿到了物件,就等同於拿到了資料和方法。(物件可以查詢類的屬性,包括資料屬性和函式屬性)
2.繫結方法分為兩種:
一種是繫結給物件(預設)
一種是繫結給類
所有定義在類中的函式的共同點是都含有一個引數,看繫結方式的不同,引數分別是類,和物件。
當繫結給類時,預設將類本身當做引數傳入,此時無論物件呼叫這個方法,還是類呼叫這個方法都不需要再將物件或類作為引數手動傳參。
當方法繫結給物件時,預設是將物件作為引數傳入,此時物件在呼叫該方式時,不需要手動傳參,但是類在呼叫時,需要手動傳參。
>>繫結給類:
繫結給類時:物件和類都能直接呼叫這個方法,都不需要手動將物件作為引數新增到方法函式中,但是會預設自動新增(不是不新增,而是自動新增)。
>>繫結給物件:預設情況下,類中函式(方法)都是繫結給
繫結給物件時:
1.當用物件來呼叫類中的方法時:預設會把物件傳入方法中,不需要手動新增。
2.當用類來呼叫時:則需要手動傳入物件,即呼叫這個方法時,需將物件作為引數傳入。
一個方法到底應該繫結給物件還是繫結給類?
當要處理的資料包含在類中時,就應該繫結給類。
當要處理的資料包含在一個物件中時,就應該繫結給物件。
類的繫結方法與物件的繫結方法:
相同點:都會自動傳值
都可以被類和物件呼叫(只不過傳參方式不同,一個需要手動傳參)
不同點:1物件繫結方法在呼叫時,傳入的是物件自己,而類繫結方法,傳入的是類自己。
2第一個引數,一個cls一個叫self。
為什麼要繫結:
簡化程式碼,提高效率。
六、非繫結方法:@staticmethod(靜態)
在類中,既不繫結給類,也不繫結給物件,此時不在有預設引數
特點:不會自動傳參,類和物件都能呼叫
當功能不需要訪問類的資料,也不訪問物件的資料,就可以作為一個非繫結方法。
在obj.name會先從obj自己的名稱空間裡找name,找不到則去類中找,類也找不到就找父類...最後都找不到就丟擲異常 ,如果在自己的名稱空間中找到,即使變數名和類中的變數名相同,也只取自己名稱空間中的值>>>>>在自己名稱空間中訪問到就不會再去其他空間訪問,而且自己名稱空間的訪問順序排在首位。