python类及其方法
一、介紹
在 Python 中,面向對象編程主要有兩個主題,就是類和類實例
類與實例:
類與實例相互關聯著:類是對象的定義,而實例是"真正的實物",它存放了類中所定義的對象
的具體信息。
類有這樣一些的優點:
1、類對象是多態的:也就是多種形態,這意味著我們可以對不同的類對象使用同樣的操作方法,而不需要額外寫代碼。 2、類的封裝:封裝之后,可以直接調用類的對象,來操作內部的一些類方法,不需要讓使用者看到代碼工作的細節。 3、類的繼承:類可以從其它類或者元類中繼承它們的方法,直接使用。二、類的定義
1.定義類(class)的語法
1 >>> class Iplaypython: 2 >>> def fname(self, name): 3 >>> self.name = name一第行,語法是class 后面緊接著,類的名字,最后別忘記“冒號”,這樣來定義一個類。
類的名字,首字母,有一個不可文的規定,最好是大寫,這樣需要在代碼中識別區分每個類。
第二行開始是類的方法,大家看到了,和函數非常相似,但是與普通函數不同的是,它的內部有一個“self”,參數,它的作用是對于對象自身的引用。
2.初始化對象
創建類時,可以定義一個特定的方法,名為__init__(),只要創建這個類的一個實例就會運行這個方法。可以向__init__()方法傳遞參數,這樣創建對象時就可以把屬性設置為你希望的值__init__()這個方法會在創建對象時完成初始化
>>> 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
...
實例化這個類的對象時:
>>> zhangsan=peo("zhangsan",24,'man')
>>> print zhangsan.Age
24
>>> print zhangsan.Name
zhangsan
>>> print zhangsan.Sex
man
之前多次用到self這個形參類就好比是一張藍圖,使用一個類可以創建多個對象實例,speak()方法在被調用時,必須知道是哪個對象調用了它.
這里self參數就會告訴方法是哪個對象來調用的.這稱為實例引用。
?
3.類的私有屬性:
__private_attrs 兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs
類的方法
在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數
私有的類方法
__private_method 兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。在類的內部調用slef.__private_methods
?
4.?classmethod類方法
1) 在python中.類方法 @classmethod 是一個函數修飾符,它表示接下來的是一個類方法,而對于平常我們見到的則叫做實例方法。 類方法的第一個參數cls,而實例方法的第一個參數是self,表示該類的一個實例。
2) 普通對象方法至少需要一個self參數,代表類對象實例
3)類方法有類變量cls傳入,從而可以用cls做一些相關的處理。并且有子類繼承時,調用該類方法時,傳入的類變量cls是子類,而非父類。 對于類方法,可以通過類來調用,就像C.f(),有點類似C++中的靜態方法, 也可以通過類的一個實例來調用,就像C().f(),這里C(),寫成這樣之后它就是類的一個實例了。
class info(object):
@classmethod
def sayclassmethod(cls):
print 'say %s' % cls
def saymethod(self):
print 'say %s' % self
test = info()
test.saymethod()##實例調用方法
test.sayclassmethod()##實例調用類方法
info.saymethod(test)##類調用實例方法
info.sayclassmethod()##類調用類方法
大家對比運行下。
?
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#以訪問類屬性的方法訪問對象的方法
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
在該類中定義三個函數,分別用作賦值、取值、刪除變量
property函數原型為property(fget=None,fset=None,fdel=None,doc=None),上例根據自己定義相應的函數賦值即可。
?
?
三、繼承類定義:
1.單繼承
class <類名>(父類名)
<語句>
#單繼承示例
class student(people): ?
? ? ? ? grade = '' ?
? ? ? ? def __init__(self,n,a,w,g): ?
? ? ? ? ? ? #調用父類的構函 ?
? ? ? ? ? ? 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)
<語句1>
需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索,即方法在子類中未找到時,從左到右查找父類中是否包含方法
#另一個類,多重繼承之前的準備 ?
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()#方法名同,默認調用的是在括號中排前地父類的方法
四、類的專業方法
Python 類可以定義專用方法,專用方法是在特殊情況下或當使用特別語法時由 Python 替你調用的,而不是在代碼中直接調用(象普通的方法那樣)。
1 __init__
類似于構造函數
#!/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__
類似于析構函數
#!/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)的時候,會自動調用__repr__函數,該函數返回對象字符串表達式,
用于重建對象,如果eval(repr(obj))會得到一個對象的拷貝。
#!/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語句輸出內建數據類型。有時,程序員希望定義一個類,要求它的對象也能用print語句輸出。Python類可定義特殊方法__str__,為類的對象提供一個不正式的字符串表示。如果類的客戶程序包含以下語句:
print objectOfClass
那么Python會調用對象的__str__方法,并輸出那個方法所返回的字符串。
#!/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__接收一個形如"(xxx) xxx-xxxx"的字符串。字符串中的每個x都是電話號碼的一個位數。方法對字符串進行分解,并將電話號碼的不同部分作為屬性存儲。
方法__str__是一個特殊方法,它構造并返回PhoneNumber類的一個對象的字符串表示。解析器一旦遇到如下語句:
print phone就會執行以下語句:
print phone.__str__()程序如果將PhoneNumber對象傳給內建函數str(如str(phone)),或者為PhoneNumber對象使用字符串格式化運算符%(例如"%s"%phone),Python也會調用__str__方法。
5__cmp __
比較運算符,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
說明:在對類進行比較時,python自動調用__cmp__方法,如-10 < 0 返回 -1,也就是說study 應該小與 -10,估打印ok2
6__getitem__
__getitem__ 專用方法很簡單。象普通的方法 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__ 簡單地重定向到真正的字典 self.data ,讓它來進行工作。
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__ 在調用 del instance[key] 時調用 ,你可能記得它作為從字典中刪除單個元素的方法。當你在類實例中使用 del 時,Python 替你調用 __delitem__ 專用方法。
?
?
總結
以上是生活随笔為你收集整理的python类及其方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu16.04自动、手动安装Mo
- 下一篇: Python shutil文件操作、文件