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__方法定義為靜態方法,至少需要傳遞一個引數cls,cls表示需要例項化的類物件,
此方法在你例項化物件時自動呼叫,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,設定類的屬性為__,不能使用物件名.屬性名的方式直接訪問物件的屬性。就好像java的private一樣,可以達到封裝的目的,
那我們我怎麼對該屬性設定值和訪問那
1:對外提供公開的用於設定物件屬性的public方法
1:設定set
2:獲取get
2:在set方法中加入邏輯判斷,過濾掉非法資料。
3:將所有的成員變數封裝加上__,提供get、set方法,
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,並返回例項物件的引用