面向对象进阶篇
- 面向對象是一種編程方式,此編程方式的實現是基于對?類?和?對象?的使用
- 類 是一個模板,模板中包裝了多個“函數”供使用(可以講多函數中公用的變量封裝到對象中)
- 對象,根據模板創建的實例(即:對象),實例用于調用被包裝在類中的函數
- 面向對象三大特性:封裝、繼承和多態
類的成員
類的成員可以分為三大類:字段、方法和屬性
?
注:所有成員中,只有普通字段的內容保存對象中,即:根據此類創建了多少對象,在內存中就有多少個普通字段。而其他的成員,則都是保存在類中,即:無論對象的多少,在內存中只創建一份。
一、字段
字段包括:普通字段和靜態字段,他們在定義和使用中有所區別,而最本質的區別是內存中保存的位置不同,
- 普通字段屬于對象
- 靜態字段屬于類
應用場景: 通過類創建對象時,如果每個對象都具有相同的字段,那么就使用靜態字段
二、方法
方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬于類,區別在于調用方式不同。
- 普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self;
- 類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類復制給cls;
- 靜態方法:由類調用;無默認參數;
三、屬性
如果你已經了解Python類中的方法,那么屬性就非常簡單了,因為Python中的屬性其實是普通方法的變種。
對于屬性,有以下三個知識點:
- 屬性的基本使用
- 屬性的兩種定義方式
- 調用時,無需括號?
靜態字段方式,創建值為country對象的靜態字段
class Foo:#靜態字段country ="中國"def func(self):print("11") #類調用靜態方法 print(Foo.country) View Code類成員的修飾符
類的所有成員在上一步驟中已經做了詳細的介紹,對于每一個類的成員而言都有兩種形式:
- 公有成員,在任何地方都能訪問
- 私有成員,只有在類的內部才能使用方法
私有成員和公有成員的定義不同:私有成員命名時,前兩個字符是下劃線。(特殊成員除外,例如:__init__、__call__、__dict__等)
class Foo:#私有字段__yer = "Wyc"def func(self):#用類調用私有字段,只能在內部調用。print(Foo.__yer) ret = Foo() ret.func() View Code class Foo:#公有靜態字段name = "中國"def func(self):pass#公有靜態字段由類調用 print(Foo.name) View Code類的特殊成員
?
?__doc__
表示類的描述信息
class Foo:"""這是__doc__的方法"""def func(self):pass#由類直接調用,類的注釋 print(Foo.__doc__) View Code class Foo:#構造方法,簡稱封裝def __init__(self):self.name = "wyc"def func(self):print(self.name) ret = Foo() ret.func() View Code__call__
對象后面加括號,觸發執行。
class Foo:def func(self):passdef __call__(self, *args, **kwargs):print("123") ret = Foo() ret() #對象后邊加括號自動觸發__call__方法 View Code?__dict__
類或對象中的所有成員
class Foo:def func(self):pass ret = Foo.__dict__ #查看類或對象中的所有成員 print(ret) View Code?__str__
如果一個類中定義了__str__方法,那么在打印 對象 時,默認輸出該方法的返回值。
class Foo: #默認輸出該↓方法的默認值def __str__(self):return "Wyc" ret = Foo() print(ret) View Code?__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分別表示獲取、設置、刪除數據
class Foo:def __setitem__(self,key,value):print(key,value) r = Foo() r["xxx"] = 123 #對象后邊加中括號就會執行__setitem__方法,一個key,一個value View Code?
class Foo:def __delitem__(self,key):print(key) r = Foo() del r["xxx"] #執行__delitem__方法,刪除key View Code?
class Foo:def __getitem__(self, item):print(item) r = Foo() r["123456"] #對象后邊加個中括號就會自動執行 View Code?__iter__?
用于迭代器,之所以列表、字典、元組可以進行for循環,是因為類型內部定義了 __iter_
class Foo(object):def __init__(self,sq):self.sq = sqdef __iter__(self):return iter(self.sq) obj = Foo([11,22,33,44,55]) for i in obj:print(i) View Code總結:
成員:
? ? ?字段 ? ? ?靜態字段(每個對象都有一份),普通字段(每個對象都有不同的數據)
? ? ?方法 ? ? ?靜態方法(無需使用對象封裝的內容),類方法,普通方法(使用對象中的數據)
? ? ?特性 ? ? ?普通特性(將方法偽造成字段)
如何快速判斷,類執行,或者對象執行:
? ? ? ? ? ? ? ? ?有self的對象調用
? ? ? ? ? ? ? ? ?無self的,類調用
總結
- 上一篇: 2017最新nginx+keepaliv
- 下一篇: JavaScript学习笔记:数组red