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