python类介绍_python类介绍
一.類的定義--class關鍵字
1. 類是用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。使用class語句來創建一個新類,class之后為類的名稱(User)并以冒號結尾,類的組成包括成員變量(name,age)和成員函數(who),如下實例:class?User:
name='zhzhgo'
age=25
def?who(self):
print?"I'm?"+self.name
2.類屬性與方法
①類的私有屬性
__private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時:self.__private_attrs。
②類的方法
在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數,如:who(self)。
③類的私有方法
__private_method:兩個下劃線開頭,聲明該方法為私有方法,不能在類的外部調用。在類的內部調用時: self.__private_methods。
注意:Python不允許實例化的類訪問私有數據,但可以使用 object._className__attrName 訪問屬性(下面代碼最后兩行):class?MyCounter:
__secretCount?=?0??#?私有變量
publicCount?=?0????#?公開變量
def?count(self):
self.__secretCount?+=?1
self.publicCount?+=?1
print?self.__secretCount
n?=?MyCounter()
n.count()
print?n.publicCount
#print?n.__secretCount??#?報錯,實例不能訪問私有變量
print?n._MyCounter__secretCount
3. 構造方法和析構方法
__init__()方法是一種特殊的方法,被稱為類的構造函數或初始化方法,當創建了這個類的實例時就會調用該方法。
__del__()被稱為類的析構函數,__del__在對象消逝的時候被調用,當對象不再被使用時,__del__方法運行。class?User(object):
"用戶類"
count=0
def?__init__(self,name,age):?#構造函數
self.name=name
self.age=age
User.count+=1
def?who(self):
print?"My?name?is?"+self.name+",I'm?"+str(self.age)+"?years?old."
def?__del__(self):?#析構函數
class_name?=?self.__class__.__name__
print?class_name,?"destroyed"
4. 創建實例對象
要創建一個類的實例,你可以使用類的名稱,并通過__init__方法接受參數,可以使用點(.)來訪問對象的屬性,類的幫助信息可以通過ClassName.__doc__查看。u1=User('zhzhgo',25)?#創建實例對象u1
u2=User('zz',18)?#創建實例對象u2
u1.who()?#訪問類方法
u2.who()
print?"Total?Object:"+str(User.count)
print?User.__doc__?#打印幫助信息
>>>
My name is zhzhgo,I'm 25 years old.
My name is zz,I'm 18 years old.
Total Object:2
用戶類
>>>
5.內置類屬性
__doc__ :類的文檔字符串
__name__: 類名
__module__: 類定義所在的模塊(類的全名是'__main__.className',如果類位于一個導入模塊mymod中,那么className.__module__ 等于 mymod)
__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)
__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)print?"User.__doc__:",?User.__doc__
print?"User.__name__:",?User.__name__
print?"User.__module__:",?User.__module__
print?"User.__bases__:",?User.__bases__
print?"User.__dict__:",?User.__dict__
>>>
User.__doc__: 用戶類
User.__name__: User
User.__module__: __main__
User.__bases__: (,)
User.__dict__: {'count': 0, '__dict__': , '__module__': '__main__', '__del__': , 'who': , '__weakref__': , '__doc__': '\xe7\x94\xa8\xe6\x88\xb7\xe7\xb1\xbb', '__init__': }
>>>
6.對象銷毀(垃圾回收)
①同Java語言一樣,Python使用了引用計數這一簡單技術來追蹤內存中的對象。在Python內部記錄著所有使用中的對象各有多少引用。一個內部跟蹤變量,稱為一個引用計數器。當對象被創建時, 就創建了一個引用計數, 當這個對象不再需要時, 也就是說, 這個對象的引用計數變為0 時, 它被垃圾回收。但是回收不是"立即"的, 由解釋器在適當的時機,將垃圾對象占用的內存空間回收。
②垃圾回收機制不僅針對引用計數為0的對象,同樣也可以處理循環引用的情況。循環引用指的是,兩個對象相互引用,但是沒有其他變量引用他們。這種情況下,僅使用引用計數是不夠的。Python 的垃圾收集器實際上是一個引用計數器和一個循環垃圾收集器。作為引用計數的補充, 垃圾收集器也會留心被分配的總量很大(及未通過引用計數銷毀的那些)的對象。 在這種情況下, 解釋器會暫停下來, 試圖清理所有未引用的循環。
上述實例中如執行:del u1,則u1對象被銷毀,打印:User destroyed
二.類的繼承
面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。聲明類的時候括號中寫要繼承的父類。類的繼承衍生出類子類,子類可以繼承或重寫父類的方法,子類可以自定義新的方法或者成員變量,比如學生類可以繼承用戶類。class?User(object):
"用戶類"
def?__init__(self,name,age):?#構造函數
self.name=name
self.age=age
def?who(self):
print?"My?name?is?"+self.name+",I'm?"+str(self.age)+"?years?old."
class?Student(User):
"學生類繼承用戶類"
def?__init__(self,name,age,height):
User.__init__(self,name,age)
self.height=height
def?who(self):
User.who(self)
#super(Student,self).who()
print?"My?height?is?"+?str(self.height)
Student("zhzhgo",25,168).who()
>>>
My name is zhzhgo,I'm 25 years old.
My height is 168
>>>
在python中繼承的特點:
1. 在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。
2. 在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別于在類中調用普通函數時并不需要帶上self參數。
3. Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。
4. 如果父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索,即方法在子類中未找到時,從左到右查找父類中是否包含該方法。如果在繼承元組中列了一個以上的類,那么它就被稱作"多重繼承" (繼承嵌套)class?類名(父類1,父類2,....,父類n)
三.實例方法、類方法、靜態方法
實例方法,類方法,靜態方法都可以通過實例或者類調用,只不過實例方法通過類調用時需要傳遞實例的引用(python 3可以傳遞任意對象,其他版本會報錯)
實例方法針對的是實例,第一個參數是self,普通對象方法至少需要一個self參數,代表類對象實例;類方法針對的是類,@classmethod 它表示接下來的是一個類方法,類方法的第一個參數cls,它們都可以繼承和重新定義;靜態方法用于作為程序中的共享資源,直接通過類去調用,不用實例化對象,不需要self參數,可以認為是全局函數,@staticmethod 它表示接下來的是一個靜態方法class?Test1(object):
def?test1(self):?#定義了實例方法
print("object")
@classmethod
def?test2(cls):?#定義了類方法
print("class")
@staticmethod
def?test3():?#定義了靜態方法
print("static")
f1=Test1()
#f1.test1();?#通過實例調用
Test1.test1(f1)?#直接通過類的方式調用,但是需要自己傳遞實例引用
Test1.test2()
print?"--------------------"
#如果Test1有子類,并且子類覆蓋了這個類方法,最終會調用子類的方法并傳遞子類的類對象
class?Test2(Test1):
@classmethod
def?test2(cls):
print(cls)
print("test2?object")
f2=Test2()
f2.test2()
print?"--------------------"
f1.test3();?#使用實例調用
Test1.test3();?#直接靜態方式調用
>>>
object
class
--------------------
test2 object
--------------------
static
static
>>>
總結
以上是生活随笔為你收集整理的python类介绍_python类介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程安全的map_ThreadLocal
- 下一篇: 用python玩转数据作业答案_大学mo