1. 程式人生 > >面線物件之類與物件

面線物件之類與物件

一、面向物件:

面向物件是一種程式設計思想,即編寫程式碼的方式方法。

OOP(Object Oriented Programing)將程式看做是一堆物件的集合,實現功能的方式就是物件之間互動來實現。

 

二、類與物件:

1.面向物件思想中最核心的概念就是:物件與類。

定義:

什麼是物件:一切皆物件,物件指的是具備某些特徵和技能的集合體,是實實在在的存在的具體物體(我的手機是物件,手機不是物件是一個類)。

什麼是類:(類別,分類)類是一個抽象概念,是根據一些列具備相同特徵和技能的物件抽取得到的,比如說人類、鳥、花。通過類就能知道一個物件的特徵。

類與物件的關係:類包含了一些列相同特徵和技能的物件,物件是屬於類的例項。

在程式中是:先有類,才能通過類來產生物件,要先確定物件具備什麼特徵和什麼行為才能產生物件。

 

2.面向物件的優缺點:

優點:

1.不用考慮繁瑣的實現步驟,(從一個操作工,變成了老闆);

2.擴充套件性高,當需要一個新功能時,搞一個具備新功能的物件,命令它去完成任務;

3.各個物件之間耦合度較低,當一個物件出現了問題,不會對其他物件產生問題;

4.可維護性高。

缺點:

1.面向物件的複雜度比面向過程高。

2.無法預知執行結果,如王者榮耀的遊戲,一定不能把過程寫死,每個英雄的行為是不固定的。

使用場景:需要較高的擴充套件性(直接與使用者發生互動的程式對擴充套件性要求較高,如微信)

  對於不需要擴充套件的程式而言,使用面向物件會增加複雜度。)

 

為什麼要用面向物件:在當前很多程式都需要與使用者直接打交道,使用者需求千變萬化,所以對擴充套件性要求特別高。

 

面向物件的本質:使用不同的物件來完成任務。

 

 

 

三、定義一個類:關鍵字class+類名

class  Penrson:

   name=‘蓋倫’

類名的定義規範:類名要按照駝峰體書寫,如ThisIsPerson,即單詞首字母大寫。

 

如何得到一個物件:先定義一個類,在呼叫這個類並賦值給一個物件,就得到了一個物件。

 

訪問物件的屬性:用物件加點綴。

屬性查詢:

類有兩種屬性:資料性和函式屬性。

  1. 類的資料屬性是所有物件共享的。(所有物件共享的屬性的id是相同的)
  2. 類的函式屬性是繫結給物件用的。

 

每一個物件都對應著一個記憶體地址,在建立物件時,計算機會申請一個新的記憶體空間,並將物件中的內容存進去。由於name的值是申明在類中的,所以person1.nameperson2.nameID是相同的。

 

當所有物件的某個屬性都相同時,放在類中。

當每個物件的某個屬性不相同時,放到物件中。

 

可以通過 物件名.__dict__獲取物件的所有屬性,結果為字典型,但不包括類中的共享屬性。

通過 類名.__dict__獲取類中包含的所有屬性,包括類中定義的函式變數,函式等等資訊。

 

當物件中屬性不存在時,會去類中訪問,如果物件中存在這個屬性,會優先訪問物件中的屬性。即查詢順序為:先物件,後類。

 

當建立一個類、物件的時候 ,會產生一個名稱空間,儲存類、物件中名稱與值得繫結關係。

 

類還有一個作用:就是作為物件的模板,所有屬於該類的物件,都具備類中的公共內容。

 

即使類中,什麼都不寫,也存在一些自帶的屬性,是從父類中得到的。

 

 

四、初始化函式:(@classmethod

定義一個函式,目的用於設定物件的屬性,如果沒有物件,這個函式就沒有意義,也就是初始化函式與類是一個整體。

物件一建立就應該進行初始化,所以最好的是將建立與初始化進行繫結。

 

初始化函式使用內建函式__init__self,其他屬性引數),將該函式定義在類中,會在呼叫類時自動執行,(不需要呼叫__inint__,能自動執行。)self引數必須有,表示要進行初始化物件,系統會自動傳值。

 

 

五、繫結方法:是把物件與函式進行繫結。

1.為什麼要把方法與物件進行繫結:物件本質上是存放資料的容器,所以實質是把這個資料容器與函式進行繫結,函式的作用是實現功能即處理資料得到結果。

只要拿到了物件,就等同於拿到了資料和方法。(物件可以查詢類的屬性,包括資料屬性和函式屬性)

 

 

 

2.繫結方法分為兩種:

一種是繫結給物件(預設)

一種是繫結給類

 

所有定義在類中的函式的共同點是都含有一個引數,看繫結方式的不同,引數分別是類,和物件。

當繫結給類時,預設將類本身當做引數傳入,此時無論物件呼叫這個方法,還是類呼叫這個方法都不需要再將物件或類作為引數手動傳參。

當方法繫結給物件時,預設是將物件作為引數傳入,此時物件在呼叫該方式時,不需要手動傳參,但是類在呼叫時,需要手動傳參。

 

>>繫結給類:

 

繫結給類時:物件和類都能直接呼叫這個方法,都不需要手動將物件作為引數新增到方法函式中,但是會預設自動新增(不是不新增,而是自動新增)。

 

>>繫結給物件:預設情況下,類中函式(方法)都是繫結給

 

繫結給物件時:

1.當用物件來呼叫類中的方法時:預設會把物件傳入方法中,不需要手動新增。

 

2.當用類來呼叫時:則需要手動傳入物件,即呼叫這個方法時,需將物件作為引數傳入。

 

 

一個方法到底應該繫結給物件還是繫結給類?

   當要處理的資料包含在類中時,就應該繫結給類。

   當要處理的資料包含在一個物件中時,就應該繫結給物件。

 

類的繫結方法與物件的繫結方法:

相同點:都會自動傳值

都可以被類和物件呼叫(只不過傳參方式不同,一個需要手動傳參)

不同點:1物件繫結方法在呼叫時,傳入的是物件自己,而類繫結方法,傳入的是類自己。

        2第一個引數,一個cls一個叫self

 

為什麼要繫結:

 

簡化程式碼,提高效率。

 

 

 

六、非繫結方法:@staticmethod(靜態)

在類中,既不繫結給類,也不繫結給物件,此時不在有預設引數

特點:不會自動傳參,類和物件都能呼叫

當功能不需要訪問類的資料,也不訪問物件的資料,就可以作為一個非繫結方法。

 

 obj.name會先從obj自己的名稱空間裡找name,找不到則去類中找,類也找不到就找父類...最後都找不到就丟擲異常  ,如果在自己的名稱空間中找到,即使變數名和類中的變數名相同,也只取自己名稱空間中的值>>>>>在自己名稱空間中訪問到就不會再去其他空間訪問,而且自己名稱空間的訪問順序排在首位。