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