一、面向對象
-
語言的分類?? ?? ? 面向機器:抽象成機器指令,機器容易理解,代表是?匯編語言?? ?? ? 面向過程:做一件事情,排出個步驟,第一步干什么,第二步干什么,如果出現情況?A,做什么處理,如果出現了情況?B,做什么處理?? ??? ??? ??? ??? ??? ?? 問題規模小,可以步驟化,按部就班處理,代表是?C語言?? ?? ? 面向對象OOP(Object Oriented Programming):隨著計算機需要解決的問題的規模擴大,情況越來越復雜,需要很多人,很多部門協作,面向過程編程不太適合了,代表是?C++、Java、Python等
-
面向對象:一種認識世界、分析世界的方法論,將萬事萬物抽象為類。類:抽象的概念,是萬事萬物的抽象,是一類事物的共同特征的集合,用計算機語言來描述類,就是屬性和方法的集合。對象:是類的具象,是一個實體,對于我們每個人這個個體,都是抽象概念人類的不同的實體。舉例:你吃魚?? ??? ?? 你,是對象;魚,也是對象;吃就是動作?? ??? ?? 你,是具體的人,是具體的對象,你屬于人類,人類是個抽象的概念,是無數具體的個體的抽象?? ??? ?? 魚,也是具體的對象,就是你吃的這一條具體的魚,這條魚屬于魚類,是無數的魚抽象出來的概念?? ??? ?? 吃,是動作,也是操作,也是方法,這個吃是你的動作,也就是人類具有的方法哲學:一切皆對象?? ??? ?? 對象是數據和操作的封裝?? ??? ?? 對象是獨立的,但是對象之間可以相互作用?? ?? ? ? 目前?OOP?是最接近人類認知的編程方式
-
面向對象的三要素封裝?? ?? ? 組裝:將數據和操作組裝到一起?? ?? ? 隱藏數據:對外只暴露一些接口,通過接口訪問對象繼承?? ?? ? 多復用,繼承來的就不用自己寫了?? ?? ? 多繼承少修改,OCP(Open-closed?Principle),使用繼承來改變,來體現個性多態?? ?? ? 面向對象編程最靈活的地方,動態綁定人類就是封裝;人類繼承自動物類,孩子繼承父母特征,分為單一繼承、多繼承;多態,繼承自動物類的人類、貓類的操作“吃”不同
-
Python?類的定義:必須使用?class?關鍵字;類名必須是用大駝峰命名;類定義完成后,就產生了一個類對象,綁定到了標識符?ClassName?上
-
Python?類實例化后,會自動調用 __init__?方法,這個方法第一個參數必須留給?self,其他參數隨意,作用就是對實例進行初始化,注意 __init__( )?方法不能有返回值,也就說只能是?None?? ?類實例化后一定會獲得一個對象,就是實例對象,__init__?方法的第一個參數?self?就是指代某一個實例,表示創建的類實例本身,因此,在 __init__?方法內部,就可以把各種屬性綁定到?self? ? 在類中定義函數只有一點不同,就是第一參數永遠是類的本身實例變量?self,并且調用時,不用傳遞該參數
-
實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法__name__? 對象名__class__? 對象的類型__dict__? 對象的屬性的字典__qualname__? 類的限定名總結:類變量是屬于類的變量,這個類的所有實例可以共享這個變量?? ??? ?? 實例變量只能通過實例訪問,通過類訪問不到?? ?? ? ? 類變量使用全大寫來命名
-
類裝飾器def add_name(name):????def wrapper(cls):????????cls.NAME = name????????return cls????return wrapper@add_name(‘Tom’)class Person:????AGE = 3print(Person.NAME)
-
類方法?? ?? ? 在類定義中,使用 @classmethod?裝飾器修飾的方法?? ?? ? 必須至少有一個參數,且第一個參數留給了?cls,cls?指代調用者即類對象自身?? ?? ? cls?這個標識符可以是任意合法名稱,但是為了易讀,請不要修改?? ?? ? 通過?cls?可以直接操作類的屬性? ? 靜態方法?? ?? ? 在類定義中,使用 @staticmethod?裝飾器修飾的方法?? ?? ? 調用時,不會隱式的傳入參數?? ?? ? 靜態方法只是表明這個方法屬于這個名詞空間,函數歸在一起,方便組織管理總結:類除了普通方法都可以調用,普通方法需要對象的實例作為第一參數?? ??? ?? 實例可以調用所有類中定義的方法(包括類方法、靜態方法),普通方法傳入實例自身,靜態方法和類方法需要找到實例的類
-
訪問控制? ? ? ? 私有屬性:使用雙下劃線開頭的屬性名?? ?? ? 私有變量的本質:如果聲明了一個實例變量的時候,使用雙下劃線,Python?解釋器會將其改名,轉換名稱為 _類名__變量名?的名稱,所以用原來的名字訪問不到了?? ?? ? 保護變量:在變量名前使用一個下劃線,Python?解釋器不會做任何改變,和普通屬性一樣,這只是開發者共同的約定,看見這種變量,就如同私有變量,不要直接使用?? ?? ? 私有方法:參照私有變量、保護變量,使用單雙劃線、單下劃線命名方法?? ?? ? 私有方法的本質:單下劃線的方法只是開發者之間的約定,解釋器不做任何改變?? ??? ??? ??? ??? ??? ??? ??? ?? ?雙下劃線的方法,是私有方法,解釋器會改名,改名策略和私有變量相同,_類名__方法名?? ??? ??? ??? ??? ??? ??? ??? ?? ? 方法變量都在類的 __dict__?中可以看到
-
屬性裝飾器:把實例的屬性保護起來,不讓外部直接訪問,外部使用?getter?讀取屬性和?setter 設置屬性property 裝飾器:后面跟的函數名就是以后的屬性名,它就是?getter,這個必須有,有了它至少是只讀屬性setter?裝飾器:與屬性名同名,且接收 2?個參數,第一個是?self,第二個是將要賦值的值,有了它,屬性可寫deleter 裝飾器:可以控制是否刪除屬性,很少用property?裝飾器必須在前,setter、deleter?裝飾器在后,class Person:????def __init__(self,name,age=18):????????self.name = name????????self.__age = age????@property????def age(self):????????return self.__age????@age.setter????def age(self,age):????????self.__age = age????@age.deleter????def age(self):????????# del self.__age????????print(‘del’)tom = Person(‘Tom’)print(tom.age)tom.age = 20print(tom.age)del tom.age第二種方法是先定義三個函數,再加上一句?age = property(getage,setage,delage,’age property’),最后一個字段是?文檔?的意思第三種方法是?age = property(lambda self:self.__age),這個只能起到只讀的作用,不能寫入
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97663