1. 程式人生 > >Python類及常見的方法屬性定義

Python類及常見的方法屬性定義

Python類及常見的方法屬性定義

Python是一門完全面向物件(OOP)的語言,對於Python來說,一切皆物件,

 

一切皆物件,

貓,老虎,狗,狼這些都是我們認識的一種動物,在現實生活中我們把它叫做動物,而在面向物件的程式語言(OOP)中我們稱這類在生活中的具體事物叫做物件,既然提到物件我們就不得不說一下類,什麼是類那,打個比方,就好動物學家通過動物的共同點,把動物進行分類,貓和老虎被分到了貓科,狗和狼被分到了犬科,貓科,犬科實際上就是一種類,因為他們具備了貓和老虎的共同點,所以你就可以把類理解為事物共同點的抽象

不過在現實生活我們是通過物件去認識類的,而在程式語言中我們把他進行了反轉,是通過類去認識物件,

 

物件和類

物件就是類的例項化,類就是物件的具體抽象

 

面向物件的三大特徵

封裝(encapsulation)

繼承(inheritance)

多型(polymorphism)

開發的過程:其實就是不斷的建立物件,使用物件,指揮物件做事情。

設計的過程:其實就是在管理和維護物件之間的關係.

 

Python中的類

     定義類

定義一個簡單的person類,在這個類裡沒有定義任何方法

建立類

在上面我們定義了一個類,下面我們就用這個類建立一個例項物件P

 

定義一個帶方法的類

 

建立一個類呼叫方法


定義一個帶有各種常用變數,方法型別的類

class Person(object):

   '''

    起到限制作用,表示在類中只能有這三個屬性,不可以在動態或靜態的新增對該類的例項新增屬性

    注意在使用__slots__限制變數時,如果加入類變數的名稱不發生錯誤,如下

    錯誤寫法:

    __slots__ = ("_id", "name","__age","address")

   '''

   __slots__ = ("_id", "name", "__age")

   address = "我是一個類變數,可以被類名直接呼叫"

   def __new__(cls, *args, **kwargs):

       print("建立類時呼叫")

       return object.__new__(cls)

   def __init__(self):

       self.name = "我是一個全域性變數,在任何地方都可以呼叫"

       self._id = "我只可以在本模組裡被呼叫"

       self.__age = "我是一個私有變數,只能在本類裡呼叫不能再外部呼叫"

       print("初始化例項變數時被呼叫")

   def test(self):

       print("我是一個例項方法只有物件被建立才可以被物件呼叫")

 

   def __testPri(self):

       print("我是一個私有方法,不可以被外不呼叫")


   @staticmethod

    deftestStatic(self):

       print("我是一個靜態方法可以直接用類名被呼叫")

   @classmethod

   def testCls(cls):

       print("我是一個類方法可以直接用類名被呼叫")

   def __del__(self):

       print("類被銷燬時呼叫")

   def __str__(self):

       print("返回對類的描述")

       return "我是%s"%self.__class__.__name__

   def __call__(self, *args, **kwargs):

       print("類被當做函式使用時呼叫")

 

各種變數,內建方法淺解

__new__

1,  __new__方法只能在繼承了object的新式類中使用,在object類中將__new__方法定義為靜態方法,至少需要傳遞一個引數clscls表示需要例項化的類物件,

此方法在你例項化物件時自動呼叫,cls引數也由Python直譯器自動提供

2, 複寫__new__必須時要有返回值,返回例項化出來的例項物件,可以return返回父類__new__出來的例項,或者直接是object__new__出來的例項都可以,上文是直接呼叫object__new__方法

3,__new__()是唯一在例項建立之前執行的方法,一般用在定義元類時使用

 

__init__

 

1,__init__方法由Python直譯器自動呼叫,在呼叫時會自動傳入一個本類的例項變數

2__init__方法是在__new__之後呼叫的,因為Python直譯器需要__new__返回的例項物件,作為引數傳入__init__方法

3__init__主要用於初始化本物件的例項變數或初始化父類的例項變數

       初始化父類的例項變數如下:

       superName.__init__(self)

       super(superName, self).__init()  #新式類中使用

4, __init__不需要返回值

 

__del__


1,__init__方法由Python直譯器自動呼叫,在呼叫時會自動傳入一個本類的例項變數

2__del__是在python刪除一個物件時有Python自動呼叫的,

       那什麼時候,會讓Python記憶體管理機制認為他是需要刪除的那,當他的引用計數器為零,也就是沒有沒有任何引用時Python會認為他需要被釋放,然後呼叫__del__方法

      

       檢視一個物件的引用計數

       importsys

       sys.getrefcount(object )

 

__str__

 

1,此方法的作用,是描述一個類描述,如果沒有重寫會直接返回一個類的

<__main__.類名 父類at 儲存地址>

<__main__.Person object at0x000001231DE6FF48>

 

__call__


如果重寫類這個方法,就可以把這個型別的物件當做函式來用,相當於過載了括號運算子,

在類裝飾器會用到

 

私有化例項變數

 


1,設定類的屬性為__,不能使用物件名.屬性名的方式直接訪問物件的屬性。就好像javaprivate一樣,可以達到封裝的目的,

那我們我怎麼對該屬性設定值和訪問那

1:對外提供公開的用於設定物件屬性的public方法

                1:設定set

                2:獲取get

   2:在set方法中加入邏輯判斷,過濾掉非法資料。

   3:將所有的成員變數封裝加上__,提供getset方法,

 

Ps:其實在python中的,類的私有化是通過改變屬性名實現的,修改規則如下:

_類名__屬性名

呼叫使用被Python修改過得私有屬性

列印結果

2,私有化屬性也是例項屬性,Python每建立一個例項物件,就會在記憶體空間中開闢一處記憶體,每處記憶體空間都有例項屬性,他們不會相互影響,也就是說你修改一個物件的例項屬性,另一個同類物件的同名屬性不會受到影響,是相對獨立

單下劃線變數

_xx以單下劃線開頭的表示的是protected型別的變數。即保護型別只能允許其本身與子類進行訪問。若內部變數標示,如: 當使用“from M import”時,不會將以一個下劃線開頭的物件引入

 

類屬性


1,類屬性是指,那些定義在類裡,方法之外的屬性

2,類屬性,不隨例項物件的建立而建立,無論你使用該類建立多少個例項物件,類屬性只存在一個

3,類屬性就是類物件擁有的屬性,他被類物件的所有例項物件所共有,可用於例項物件間的資料共享,不可以用self.類屬性,因為self代表當前呼叫者物件,

4,使用類屬性時 需要用 類名.類屬性名或 類物件的例項物件.類屬性名訪問,,如果要修改值時,需要用 類名.類屬性名 = xxx” 去修改,不可以用 類物件的例項物件.類屬性名,

如果使用 類物件的例項物件.類屬性名 修改,則相當於為該物件添加了一個例項屬性,

 

靜態方法

1,靜態方法要使用@staticmethod修飾,要不然就是例項方法

2,靜態方法可以不寫引數,但如果這樣就不能呼叫當用例項屬性

3,在無參靜態方法裡不可以呼叫例項屬性,self,super,因為靜態方法是先於例項物件存在的,

4,要想在靜態方法裡呼叫例項方法,可以在靜態方法中寫上引數,把當前例項物件當做實參傳給靜態方法,這樣就可以間接的呼叫靜態方法

如下


類方法

 

1,類方法是類物件的方法,只有一個

2,類方法要使用@classmethod修飾,要不然就是例項方法

3,類方法的第一個引數是類物件,由Python自動傳入,

4,在類方法裡不可以呼叫例項屬性,self,super,因為類方法是先於例項物件存在的,

私有方法

1,Python中私有方法通過前面加兩個下劃線來定義  如:def __xx(self):

2,只有該類物件的例項物件可以訪問子類已不可訪問,不可以在外部呼叫,

 

建立物件的呼叫順序    

1,  先呼叫__new__方法,由此方法返回一個例項物件給呼叫者(Python直譯器)

2,呼叫者(Python直譯器)在把剛剛建立的 例項物件 作為實參傳遞並呼叫__init__方法,完成初始化

3,並返回例項物件的引用