面線對象之類與對象

1、面向對象:編程

面向對象是一種編程思想,即編寫代碼的方式方法。微信

OOP(Object Oriented Programing)將程序看作是一堆對象的集合,實現功能的方式就是對象之間交互來實現。函數

 

2、類與對象:spa

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

定義:遊戲

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

什麼是類:(類別,分類)類是一個抽象概念,是根據一些列具有相同特徵和技能的對象抽取獲得的,好比說人類、鳥、花。經過類就能知道一個對象的特徵。it

類與對象的關係:類包含了一些列相同特徵和技能的對象,對象是屬於類的實例。模板

在程序中是:先有類,才能經過類來產生對象,要先肯定對象具有什麼特徵和什麼行爲才能產生對象。class

 

2.面向對象的優缺點:

優勢:

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

2.擴展性高,當須要一個新功能時,搞一個具有新功能的對象,命令它去完成任務;

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

4.可維護性高。

缺點:

1.面向對象的複雜度比面向過程高。

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

使用場景:須要較高的擴展性(直接與用戶發生交互的程序對擴展性要求較高,如微信)

  對於不須要擴展的程序而言,使用面向對象會增長複雜度。)

 

爲何要用面向對象:在當前不少程序都須要與用戶直接打交道,用戶需求變幻無窮,因此對擴展性要求特別高。

 

面向對象的本質:使用不一樣的對象來完成任務。

 

 

 

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

class  Penrson:

   name=‘蓋倫’

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

 

如何獲得一個對象:先定義一個類,在調用這個類並賦值給一個對象,就獲得了一個對象。

 

訪問對象的屬性:用對象加點綴。

屬性查找:

類有兩種屬性:數據性和函數屬性。

  1. 類的數據屬性是全部對象共享的。(全部對象共享的屬性的id是相同的)
  2. 類的函數屬性是綁定給對象用的。

 

每個對象都對應着一個內存地址,在建立對象時,計算機會申請一個新的內存空間,並將對象中的內容存進去。因爲name的值是申明在類中的,因此person1.nameperson2.nameID是相同的。

 

當全部對象的某個屬性都相同時,放在類中。

當每一個對象的某個屬性不相同時,放到對象中。

 

能夠經過 對象名.__dict__獲取對象的全部屬性,結果爲字典型,但不包括類中的共享屬性。

經過 類名.__dict__獲取類中包含的全部屬性,包括類中定義的函數變量,函數等等信息。

 

當對象中屬性不存在時,會去類中訪問,若是對象中存在這個屬性,會優先訪問對象中的屬性。即查找順序爲:先對象,後類。

 

當建立一個類、對象的時候 ,會產生一個名稱空間,存儲類、對象中名稱與值得綁定關係。

 

類還有一個做用:就是做爲對象的模板,全部屬於該類的對象,都具有類中的公共內容。

 

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

 

 

4、初始化函數:(@classmethod

定義一個函數,目的用於設置對象的屬性,若是沒有對象,這個函數就沒有意義,也就是初始化函數與類是一個總體。

對象一建立就應該進行初始化,因此最好的是將建立與初始化進行綁定。

 

初始化函數使用內置函數__init__self,其餘屬性參數),將該函數定義在類中,會在調用類時自動執行,(不須要調用__inint__,能自動執行。)self參數必須有,表示要進行初始化對象,系統會自動傳值。

 

 

5、綁定方法:是把對象與函數進行綁定。

1.爲何要把方法與對象進行綁定:對象本質上是存放數據的容器,因此實質是把這個數據容器與函數進行綁定,函數的做用是實現功能即處理數據獲得結果。

只要拿到了對象,就等同於拿到了數據和方法。(對象能夠查找類的屬性,包括數據屬性和函數屬性)

 

 

 

2.綁定方法分爲兩種:

一種是綁定給對象(默認)

一種是綁定給類

 

全部定義在類中的函數的共同點是都含有一個參數,看綁定方式的不一樣,參數分別是類,和對象。

當綁定給類時,默認將類自己當作參數傳入,此時不管對象調用這個方法,仍是類調用這個方法都不須要再將對象或類做爲參數手動傳參。

當方法綁定給對象時,默認是將對象做爲參數傳入,此時對象在調用該方式時,不須要手動傳參,可是類在調用時,須要手動傳參。

 

>>綁定給類:

 

綁定給類時:對象和類都能直接調用這個方法,都不須要手動將對象做爲參數添加到方法函數中,可是會默認自動添加(不是不添加,而是自動添加)。

 

>>綁定給對象:默認狀況下,類中函數(方法)都是綁定給

 

綁定給對象時:

1.當用對象來調用類中的方法時:默認會把對象傳入方法中,不須要手動添加。

 

2.當用類來調用時:則須要手動傳入對象,即調用這個方法時,需將對象做爲參數傳入。

 

 

一個方法到底應該綁定給對象仍是綁定給類?

   當要處理的數據包含在類中時,就應該綁定給類。

   當要處理的數據包含在一個對象中時,就應該綁定給對象。

 

類的綁定方法與對象的綁定方法:

相同點:都會自動傳值

均可以被類和對象調用(只不過傳參方式不一樣,一個須要手動傳參)

不一樣點:1對象綁定方法在調用時,傳入的是對象本身,而類綁定方法,傳入的是類本身。

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

 

爲何要綁定:

 

簡化代碼,提升效率。

 

 

 

6、非綁定方法:@staticmethod(靜態)

在類中,既不綁定給類,也不綁定給對象,此時不在有默認參數

特色:不會自動傳參,類和對象都能調用

當功能不須要訪問類的數據,也不訪問對象的數據,就能夠做爲一個非綁定方法。

 

 obj.name會先從obj本身的名稱空間裏找name,找不到則去類中找,類也找不到就找父類...最後都找不到就拋出異常  ,若是在本身的名稱空間中找到,即便變量名和類中的變量名相同,也只取本身名稱空間中的值>>>>>在本身名稱空間中訪問到就不會再去其餘空間訪問,並且本身名稱空間的訪問順序排在首位。

相關文章
相關標籤/搜索