python类及其方法
一、介紹
在 Python 中,面向?qū)ο缶幊讨饕袃蓚€(gè)主題,就是類和類實(shí)例
類與實(shí)例:
類與實(shí)例相互關(guān)聯(lián)著:類是對(duì)象的定義,而實(shí)例是"真正的實(shí)物",它存放了類中所定義的對(duì)象
的具體信息。
類有這樣一些的優(yōu)點(diǎn):
1、類對(duì)象是多態(tài)的:也就是多種形態(tài),這意味著我們可以對(duì)不同的類對(duì)象使用同樣的操作方法,而不需要額外寫代碼。 2、類的封裝:封裝之后,可以直接調(diào)用類的對(duì)象,來(lái)操作內(nèi)部的一些類方法,不需要讓使用者看到代碼工作的細(xì)節(jié)。 3、類的繼承:類可以從其它類或者元類中繼承它們的方法,直接使用。二、類的定義
1.定義類(class)的語(yǔ)法
1 >>> class Iplaypython: 2 >>> def fname(self, name): 3 >>> self.name = name一第行,語(yǔ)法是class 后面緊接著,類的名字,最后別忘記“冒號(hào)”,這樣來(lái)定義一個(gè)類。
類的名字,首字母,有一個(gè)不可文的規(guī)定,最好是大寫,這樣需要在代碼中識(shí)別區(qū)分每個(gè)類。
第二行開(kāi)始是類的方法,大家看到了,和函數(shù)非常相似,但是與普通函數(shù)不同的是,它的內(nèi)部有一個(gè)“self”,參數(shù),它的作用是對(duì)于對(duì)象自身的引用。
2.初始化對(duì)象
創(chuàng)建類時(shí),可以定義一個(gè)特定的方法,名為_(kāi)_init__(),只要?jiǎng)?chuàng)建這個(gè)類的一個(gè)實(shí)例就會(huì)運(yùn)行這個(gè)方法。可以向__init__()方法傳遞參數(shù),這樣創(chuàng)建對(duì)象時(shí)就可以把屬性設(shè)置為你希望的值__init__()這個(gè)方法會(huì)在創(chuàng)建對(duì)象時(shí)完成初始化
>>> class peo:
... ? ? def __init__(self,name,age,sex):
... ? ? ? ? ? ? self.Name = name
... ? ? ? ? ? ? self.Age = age
... ? ? ? ? ? ? self.Sex = sex
... ? ? def speak(self):
... ? ? ? ? ? ? print "my name" + self.Name
...
實(shí)例化這個(gè)類的對(duì)象時(shí):
>>> zhangsan=peo("zhangsan",24,'man')
>>> print zhangsan.Age
24
>>> print zhangsan.Name
zhangsan
>>> print zhangsan.Sex
man
之前多次用到self這個(gè)形參類就好比是一張藍(lán)圖,使用一個(gè)類可以創(chuàng)建多個(gè)對(duì)象實(shí)例,speak()方法在被調(diào)用時(shí),必須知道是哪個(gè)對(duì)象調(diào)用了它.
這里self參數(shù)就會(huì)告訴方法是哪個(gè)對(duì)象來(lái)調(diào)用的.這稱為實(shí)例引用。
?
3.類的私有屬性:
__private_attrs 兩個(gè)下劃線開(kāi)頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問(wèn)。在類內(nèi)部的方法中使用時(shí) self.__private_attrs
類的方法
在類地內(nèi)部,使用def關(guān)鍵字可以為類定義一個(gè)方法,與一般函數(shù)定義不同,類方法必須包含參數(shù)self,且為第一個(gè)參數(shù)
私有的類方法
__private_method 兩個(gè)下劃線開(kāi)頭,聲明該方法為私有方法,不能在類地外部調(diào)用。在類的內(nèi)部調(diào)用slef.__private_methods
?
4.?classmethod類方法
1) 在python中.類方法 @classmethod 是一個(gè)函數(shù)修飾符,它表示接下來(lái)的是一個(gè)類方法,而對(duì)于平常我們見(jiàn)到的則叫做實(shí)例方法。 類方法的第一個(gè)參數(shù)cls,而實(shí)例方法的第一個(gè)參數(shù)是self,表示該類的一個(gè)實(shí)例。
2) 普通對(duì)象方法至少需要一個(gè)self參數(shù),代表類對(duì)象實(shí)例
3)類方法有類變量cls傳入,從而可以用cls做一些相關(guān)的處理。并且有子類繼承時(shí),調(diào)用該類方法時(shí),傳入的類變量cls是子類,而非父類。 對(duì)于類方法,可以通過(guò)類來(lái)調(diào)用,就像C.f(),有點(diǎn)類似C++中的靜態(tài)方法, 也可以通過(guò)類的一個(gè)實(shí)例來(lái)調(diào)用,就像C().f(),這里C(),寫成這樣之后它就是類的一個(gè)實(shí)例了。
class info(object):
@classmethod
def sayclassmethod(cls):
print 'say %s' % cls
def saymethod(self):
print 'say %s' % self
test = info()
test.saymethod()##實(shí)例調(diào)用方法
test.sayclassmethod()##實(shí)例調(diào)用類方法
info.saymethod(test)##類調(diào)用實(shí)例方法
info.sayclassmethod()##類調(diào)用類方法
大家對(duì)比運(yùn)行下。
?
5.類的裝飾器@property
class Pager:
? ? def __init__(self,all_count):
? ? ? ? self.all_count=all_count
? ? @property
? ? def all_pager(self):
? ? ? ? a,b=divmod(self.all_count,10)
? ? ? ? if a==0:
? ? ? ? ? ? return a
? ? ? ? else:
? ? ? ? ? ? return ?a+1
? ? @all_pager.setter
? ? def all_pager(self,value):
? ? ? ? print(value)
? ? @all_pager.deleter
? ? def all_pager(self):
? ? ? ? print('hehe')
p=Pager(101)
ret=p.all_count#以訪問(wèn)類屬性的方法訪問(wèn)對(duì)象的方法
print(ret)
下面看第二種方法
class Pager:
? ? def __init__(self,all_count):
? ? ? ? self.all_count=all_count
? ? def f1(self):
? ? ? ? return 123
? ? def f2(self,value):
? ? ? ? print('======')
? ? def f3(self):
? ? ? ? print('+++++++')
? ? foo=property(fget=f1,fset=f2,fdel=f3)
p=Pager(101)
ret=p.foo
p.foo='alex'
print(p.foo)
del p.foo
在該類中定義三個(gè)函數(shù),分別用作賦值、取值、刪除變量
property函數(shù)原型為property(fget=None,fset=None,fdel=None,doc=None),上例根據(jù)自己定義相應(yīng)的函數(shù)賦值即可。
?
?
三、繼承類定義:
1.單繼承
class <類名>(父類名)
<語(yǔ)句>
#單繼承示例
class student(people): ?
? ? ? ? grade = '' ?
? ? ? ? def __init__(self,n,a,w,g): ?
? ? ? ? ? ? #調(diào)用父類的構(gòu)函 ?
? ? ? ? ? ? people.__init__(self,n,a,w) ?
? ? ? ? ? ? self.grade = g ?
? ? ? ? #覆寫父類的方法 ?
? ? ? ? def speak(self): ?
? ? ? ? ? ? print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade)) ? ? ??
? ? s = student('ken',20,60,3) ?
? ? s.speak()
2.類的多重繼承
class 類名(父類1,父類2,....,父類n)
<語(yǔ)句1>
需要注意圓括號(hào)中父類的順序,若是父類中有相同的方法名,而在子類使用時(shí)未指定,python從左至右搜索,即方法在子類中未找到時(shí),從左到右查找父類中是否包含方法
#另一個(gè)類,多重繼承之前的準(zhǔn)備 ?
class speaker(): ?
? ? topic = '' ?
? ? name = '' ?
? ? def __init__(self,n,t): ?
? ? ? ? self.name = n ?
? ? ? ? self.topic = t ?
? ? def speak(self): ?
? ? ? ? print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic))
#多重繼承 ?
class sample(speaker,student): ?
? ? a ='' ?
? ? def __init__(self,n,a,w,g,t): ?
? ? ? ? student.__init__(self,n,a,w,g) ?
? ? ? ? speaker.__init__(self,n,t) ?
test = sample("Tim",25,80,4,"Python") ?
test.speak()#方法名同,默認(rèn)調(diào)用的是在括號(hào)中排前地父類的方法
四、類的專業(yè)方法
Python 類可以定義專用方法,專用方法是在特殊情況下或當(dāng)使用特別語(yǔ)法時(shí)由 Python 替你調(diào)用的,而不是在代碼中直接調(diào)用(象普通的方法那樣)。
1 __init__
類似于構(gòu)造函數(shù)
#!/usr/local/bin/python
class Study:
? ? ? ? def __init__(self,name=None):
? ? ? ? ? ? ? ? self.name = name
? ? ? ? def say(self):
? ? ? ? ? ? ? ? print self.name
study = Study("Badboy")
study.say()
2 __del__
類似于析構(gòu)函數(shù)
#!/usr/local/bin/python
class Study:
? ? ? ? def __init__(self,name=None):
? ? ? ? ? ? ? ? self.name = name
? ? ? ? def __del__(self):
? ? ? ? ? ? ? ? print "Iamaway,baby!"
? ? ? ? def say(self):
? ? ? ? ? ? ? ? print self.name
study = Study("zhuzhengjun")
study.say()
3__repr__
使用repr(obj)的時(shí)候,會(huì)自動(dòng)調(diào)用__repr__函數(shù),該函數(shù)返回對(duì)象字符串表達(dá)式,
用于重建對(duì)象,如果eval(repr(obj))會(huì)得到一個(gè)對(duì)象的拷貝。
#!/usr/local/bin/python
class Study:
? ? ? ? def __init__(self,name=None):
? ? ? ? ? ? ? ? self.name = name
? ? ? ? def __del__(self):
? ? ? ? ? ? ? ? print "Iamaway,baby!"
? ? ? ? def say(self):
? ? ? ? ? ? ? ? print self.name
? ? ? ? def __repr__(self):
? ? ? ? ? ? ? ? return "Study('jacky')"
study = Study("zhuzhengjun")
study.say()
print type(repr(Study("zhuzhengjun"))) # str
print type(eval(repr(Study("zhuzhengjun")))) # instance
study = eval(repr(Study("zhuzhengjun")))
study.say()
4__str__
Python能用print語(yǔ)句輸出內(nèi)建數(shù)據(jù)類型。有時(shí),程序員希望定義一個(gè)類,要求它的對(duì)象也能用print語(yǔ)句輸出。Python類可定義特殊方法__str__,為類的對(duì)象提供一個(gè)不正式的字符串表示。如果類的客戶程序包含以下語(yǔ)句:
print objectOfClass
那么Python會(huì)調(diào)用對(duì)象的__str__方法,并輸出那個(gè)方法所返回的字符串。
#!/usr/local/bin/python
class PhoneNumber:
? ? ? ? def __init__(self,number):
? ? ? ? ? ? ? ? ?self.areaCode=number[1:4]
? ? ? ? ? ? ? ? ?self.exchange=number[6:9]
? ? ? ? ? ? ? ? ?self.line=number[10:14]
? ? ? ? def __str__(self):
? ? ? ? ? ? ? ? return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)
def test():
? ? ? ? ?newNumber=raw_input("Enter phone number in the form. (123) 456-7890: \n")
? ? ? ? ?phone=PhoneNumber(newNumber)
? ? ? ? ?print "The phone number is:"
? ? ? ? ?print phone
if__name__=="__main__":
? ? ? ? ?test()
方法__init__接收一個(gè)形如"(xxx) xxx-xxxx"的字符串。字符串中的每個(gè)x都是電話號(hào)碼的一個(gè)位數(shù)。方法對(duì)字符串進(jìn)行分解,并將電話號(hào)碼的不同部分作為屬性存儲(chǔ)。
方法__str__是一個(gè)特殊方法,它構(gòu)造并返回PhoneNumber類的一個(gè)對(duì)象的字符串表示。解析器一旦遇到如下語(yǔ)句:
print phone就會(huì)執(zhí)行以下語(yǔ)句:
print phone.__str__()程序如果將PhoneNumber對(duì)象傳給內(nèi)建函數(shù)str(如str(phone)),或者為PhoneNumber對(duì)象使用字符串格式化運(yùn)算符%(例如"%s"%phone),Python也會(huì)調(diào)用__str__方法。
5__cmp __
比較運(yùn)算符,0:等于 1:大于 -1:小于
class Study: ?
? ? ?def __cmp__(self, other): ?
? ? ? ? ?if other > 0 : ?
? ? ? ? ? ? ?return 1 ?
? ? ? ? ?elif other < 0: ?
? ? ? ? ? ? ?return - 1 ?
? ? ? ? ?else: ?
? ? ? ? ? ? ?return 0 ?
? ?
study = Study() ?
if study > -10:print 'ok1' ?
if study < -10:print 'ok2' ?
if study == 0:print 'ok3'
打印:ok2 ok3
說(shuō)明:在對(duì)類進(jìn)行比較時(shí),python自動(dòng)調(diào)用__cmp__方法,如-10 < 0 返回 -1,也就是說(shuō)study 應(yīng)該小與 -10,估打印ok2
6__getitem__
__getitem__ 專用方法很簡(jiǎn)單。象普通的方法 clear,keys 和 values 一樣,它只是重定向到字典,返回字典的值。
class Zoo: ?
? ? ?def __getitem__(self, key): ?
? ? ? ? ?if key == 'dog':return 'dog' ?
? ? ? ? ?elif key == 'pig':return ?'pig' ?
? ? ? ? ?elif key == 'wolf':return 'wolf' ?
? ? ? ? ?else:return 'unknown' ?
? ?
zoo = Zoo() ?
print zoo['dog'] ?
print zoo['pig'] ?
print zoo['wolf']
打印 dog pig wolf
7__setitem__
__setitem__ 簡(jiǎn)單地重定向到真正的字典 self.data ,讓它來(lái)進(jìn)行工作。
class Zoo: ?
? ? ?def __setitem__(self, key, value): ?
? ? ? ? ?print 'key=%s,value=%s' % (key, value) ?
? ?
zoo = Zoo() ?
zoo['a'] = 'a' ?
zoo['b'] = 'b' ?
zoo['c'] = 'c'
打印:
key=a,value=a
key=b,value=b
key=c,value=c
8 __delitem__
__delitem__ 在調(diào)用 del instance[key] 時(shí)調(diào)用 ,你可能記得它作為從字典中刪除單個(gè)元素的方法。當(dāng)你在類實(shí)例中使用 del 時(shí),Python 替你調(diào)用 __delitem__ 專用方法。
?
?
總結(jié)
以上是生活随笔為你收集整理的python类及其方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ubuntu16.04自动、手动安装Mo
- 下一篇: Python shutil文件操作、文件