天天看點

面向對象進階篇

  • 面向對象是一種程式設計方式,此程式設計方式的實作是基于對 類 和 對象 的使用
  • 類 是一個模闆,模闆中包裝了多個“函數”供使用(可以講多函數中公用的變量封裝到對象中)
  • 對象,根據模闆建立的執行個體(即:對象),執行個體用于調用被包裝在類中的函數
  • 面向對象三大特性:封裝、繼承和多态

類的成員

類的成員可以分為三大類:字段、方法和屬性

面向對象進階篇

注:所有成員中,隻有普通字段的内容儲存對象中,即:根據此類建立了多少對象,在記憶體中就有多少個普通字段。而其他的成員,則都是儲存在類中,即:無論對象的多少,在記憶體中隻建立一份。

一、字段

字段包括:普通字段和靜态字段,他們在定義和使用中有所差別,而最本質的差別是記憶體中儲存的位置不同,

  • 普通字段屬于對象
  • 靜态字段屬于類
面向對象進階篇
面向對象進階篇
class Proice:
     #靜态字段
     country = "中國"
     def __init__(self,name):
         #普通字段
         self.name = name
ret = Proice("山西")
print(ret.name)      #直接通路普通字段
print(ret.country)    #直接通路靜态字段      

View Code

應用場景: 通過類建立對象時,如果每個對象都具有相同的字段,那麼就使用靜态字段

二、方法

方法包括:普通方法、靜态方法和類方法,三種方法在記憶體中都歸屬于類,差別在于調用方式不同。

  • 普通方法:由對象調用;至少一個self參數;執行普通方法時,自動将調用該方法的對象指派給self;
  • 類方法:由類調用; 至少一個cls參數;執行類方法時,自動将調用該方法的類複制給cls;
  • 靜态方法:由類調用;無預設參數;
面向對象進階篇
面向對象進階篇
class Paric:
    def func(self):
        #普通方法
        print("name")
    @classmethod
    #類方法        最少有一個參數
    def xxoo(cls,arg1,arg2):
        print(arg1,arg2)
    #靜态方法        可也加參數也可以不加參數
    @staticmethod
    def xo():
        print("xo")
ret = Paric()  #建立對象
ret.func()   #對象調用普通方法
Paric.xxoo(1,2)     #類調用類方法
Paric.xo()      #類調用靜态方法      

三、屬性  

如果你已經了解Python類中的方法,那麼屬性就非常簡單了,因為Python中的屬性其實是普通方法的變種。

對于屬性,有以下三個知識點:

  • 屬性的基本使用
  • 屬性的兩種定義方式
  • 調用時,無需括号 
面向對象進階篇
面向對象進階篇
class Foo:
    def __init__(self,name):
        self.name = name
    #擷取
    @property
    def func(self):
        temp = self.name
        return temp
    #設定
    @func.setter
    def func(self,value):
        self.name = value
    #調用
    @func.deleter
    def func(self):
        del self.name

ret = Foo("Wyc")
r = ret.func    #擷取
print(r)
del ret.func      #删除
ret.func = "nihao"      #設定
       

靜态字段方式,建立值為country對象的靜态字段

面向對象進階篇
面向對象進階篇
class Foo:
    #靜态字段
    country ="中國"
    def func(self):
        print("11")
#類調用靜态方法
print(Foo.country)       

類成員的修飾符

類的所有成員在上一步驟中已經做了詳細的介紹,對于每一個類的成員而言都有兩種形式:

  • 公有成員,在任何地方都能通路
  • 私有成員,隻有在類的内部才能使用方法

私有成員和公有成員的定義不同:私有成員命名時,前兩個字元是下劃線。(特殊成員除外,例如:__init__、__call__、__dict__等)

面向對象進階篇
面向對象進階篇
class Foo:
    #私有字段
    __yer = "Wyc"
    def func(self):
        #用類調用私有字段,隻能在内部調用。
        print(Foo.__yer)
ret = Foo()
ret.func()      
面向對象進階篇
面向對象進階篇
class Foo:
    #公有靜态字段
    name = "中國"
    def func(self):
        pass
    #公有靜态字段由類調用
print(Foo.name)      

類的特殊成員

 __doc__

  表示類的描述資訊

面向對象進階篇
面向對象進階篇
class  Foo:
    """
    這是__doc__的方法
    """
    def func(self):
        pass
    #由類直接調用,類的注釋
print(Foo.__doc__)      
面向對象進階篇
面向對象進階篇
class Foo:
    #構造方法,簡稱封裝
    def __init__(self):
        self.name = "wyc"
    def func(self):
        print(self.name)
ret = Foo()
ret.func()      

__call__

  對象後面加括号,觸發執行。

面向對象進階篇
面向對象進階篇
class Foo:
    def func(self):
        pass
    def __call__(self, *args, **kwargs):
        print("123")
ret = Foo()
ret()   #對象後邊加括号自動觸發__call__方法      

 __dict__

  類或對象中的所有成員

面向對象進階篇
面向對象進階篇
class Foo:
    def func(self):
        pass
ret = Foo.__dict__    #檢視類或對象中的所有成員
print(ret)      

 __str__

  如果一個類中定義了__str__方法,那麼在列印 對象 時,預設輸出該方法的傳回值。

面向對象進階篇
面向對象進階篇
class Foo:
#預設輸出該↓方法的預設值
    def __str__(self):
        return "Wyc"
ret = Foo()
print(ret)      

 __getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示擷取、設定、删除資料

面向對象進階篇
面向對象進階篇
class Foo:
    def __setitem__(self,key,value):
        print(key,value)
r = Foo()
r["xxx"] = 123
#對象後邊加中括号就會執行__setitem__方法,一個key,一個value      
面向對象進階篇
面向對象進階篇
class Foo:
    def __delitem__(self,key):
         print(key)
r = Foo()
del r["xxx"]         #執行__delitem__方法,删除key      
面向對象進階篇
面向對象進階篇
class Foo:
    def __getitem__(self, item):
        print(item)
r = Foo()
r["123456"]
#對象後邊加個中括号就會自動執行      

 __iter__ 

用于疊代器,之是以清單、字典、元組可以進行for循環,是因為類型内部定義了 __iter_

面向對象進階篇
面向對象進階篇
class Foo(object):
    def __init__(self,sq):
        self.sq = sq
    def __iter__(self):
        return iter(self.sq)
obj = Foo([11,22,33,44,55])
for i in obj:
    print(i)      

總結:

成員:

     字段      靜态字段(每個對象都有一份),普通字段(每個對象都有不同的資料)

     方法      靜态方法(無需使用對象封裝的内容),類方法,普通方法(使用對象中的資料)

     特性      普通特性(将方法僞造成字段)

如何快速判斷,類執行,或者對象執行:

                 有self的對象調用

                 無self的,類調用

上一篇: 裝飾器