python 类 对象 魔法方法概念+习题
類 對象
類 對象是c++和java中都有的內(nèi)容,python定義類的簡單語法如下:
class 類名:
…類變量或者方法
Python 的類定義有點像函數(shù)定義,都是以冒號:作為類體的開始,以統(tǒng)一縮進的部分作為類體的。如果不為類定義任何類變量和方法,那么這個類就相當于一個空類,如果空類不需要其他可執(zhí)行語句,則可使用pass語句作為占位符。
class Emp:pass大概類似c++的class emp{};
Python默認的成員函數(shù)和成員變量都是公開的,Python 私有屬性和方法沒有類似別的語言的public,private等關(guān)鍵詞來修飾
由于python的動態(tài)性,它有一些類的特殊用法:
因此它的類所包含的類變量可以動態(tài)增加或刪除一一程序在類體中為新變量賦值就是增加類變量,程序也可在任何地方為己有的類增加變量;程序可通過del 語句刪除己有類的類變量。
類似的, Python 對象的實例變量也可以動態(tài)增加或刪除一一只要對新實例變量賦值就是增加實例變量,因此程序可以在任何地方為己有的對象增加實例變量;程序可通過del 語句刪除己有對象的實例變量。
在類中定義的方法默認是實例方法,定義實例方法的方法與定義函數(shù)的方法基本相同,只是實例方法的第一個參數(shù)會被綁定到方法的調(diào)用者(該類的實例)-一因此實例方法至少應(yīng)該定義一個參數(shù),該參數(shù)通常會被命名為self。
注意:實例方法的第一個參數(shù)并不一定要叫self,其實完全可以叫任意參數(shù)名,只是約定俗成地把該參數(shù)命名為self,這樣具有最好的可讀性。
構(gòu)造方法
在實例方法中有一個特別的方法__init__ ,這個方法被稱為構(gòu)造方法。構(gòu)造方法用于構(gòu)造該類的對象, Python 通過調(diào)用構(gòu)造方法返回該類的對象(無須使用new ) 。
【注意,在我的python2中寫道init是初始化函數(shù),new是真正的構(gòu)造方法,大概了解了一下:
__new__是在實例創(chuàng)建之前被調(diào)用的,它的任務(wù)就是創(chuàng)建實例然后返回該實例對象,是個靜態(tài)方法。
init__是當實例對象創(chuàng)建完成后被調(diào)用的,然后設(shè)置對象屬性的一些初始值,通常用在初始化一個類實例的時候。是一個實例方法。
一些差別:
1、繼承自object的新式類才有__new
2、__new__至少要有一個參數(shù)cls,代表當前類,此參數(shù)在實例化時由Python解釋器自動識別
3、__new__必須要有返回值,返回實例化出來的實例,這點在自己實現(xiàn)__new__時要特別注意,可以return父類(通過super(當前類名, cls))__new__出來的實例,或者直接是object的__new__出來的實例
4、__init__有一個參數(shù)self,就是這個__new__返回的實例,__init__在__new__的基礎(chǔ)上可以完成一些其它初始化的動作,__init__不需要返回值
init 和 new 最主要的區(qū)別在于:
1.init 通常用于初始化一個新實例,控制這個初始化的過程,比如添加一些屬性, 做一些額外的操作,發(fā)生在類實例被創(chuàng)建完以后。它是實例級別的方法。
2.new 通常用于控制生成一個新實例的過程。它是類級別的方法。
】
使用對象
Person 類代碼定義了一個構(gòu)造方法,該構(gòu)造方法只是方法名比較特殊: init ,該方法的第一個參數(shù)同樣是self,被綁定到構(gòu)造方法初始化的對象。與函數(shù)類似的是, Python 也允許為類定義說明文檔, 該文檔同樣被放在類聲明之后、類體之
前
在定義類之后,接下來即可使用該類了。Python 的類大致有如下作用。
1.定義變量。
2.創(chuàng)建對象。
3.派生子類
對象訪問方法或變量的語法是: 對象.變量|方法(參數(shù)〉。
例子:
class Person:hair = 'black'def __init__ (self, name ="Charlie", age=8):self.name=nameself.age= agedef say(self , content) :print(content)if __name__ == '__main__':p = Person()p.hair='nice'print(p.name,str(p.age),p.hair)p.name='何梓貽'p.age='19'print(p.name+p.age)p.say('我愛代碼')結(jié)果:
Charlie 8 nice
何梓貽19
我愛代碼
解釋:
通過Person 對象調(diào)用了say()方法,在調(diào)用方法時必須為方法的形參賦值。但say ()方法的第一個形參self 是自動綁定的,它會被綁定到方法的調(diào)用者( p ),因此程序只需要為say()
方法傳入一個字符串作為參數(shù)值,這個字符串將被傳給content 參數(shù)。
為p 對象動態(tài)增加實例變量只要為它的新變量賦值即可【聯(lián)想字典增加鍵值對直接用pp[key]=value】
上面的代碼添加:
p = Person()p.interse = '編程'print(p.interse)輸出
編程
刪除變量:
輸出
File “C:\Users\14172\PycharmProjects\pythonProject3\main.py”, line
51, in < module>
print(p.interse) AttributeError: ‘Person’ object has no attribute ‘interse’
可見python增加實例變量非常方便,不需要再在類中定義變量。
Python也允許為對象動態(tài)增加方法。比如:
結(jié)果:
我哦哦哦實時啦啦啦 <main.Person object at 0x0000026E5BC10FD0>
Process finished with exit code 0
也可以使用lambda表達式:
輸出:
lambda表達式… <main.Person object at 0x00000137DB220FD0>
注意:
Python 不會自動將調(diào)用者綁定到第一個參數(shù)
因此程序需要手動將調(diào)用者綁定到第一個參數(shù)
實例方法和self綁定
對于在類體中定義的實例方法, Python 會自動綁定方法的第一個參數(shù)(通常建議將該參數(shù)命名為self) ,第一個參數(shù)總是指向調(diào)用該方法的對象。根據(jù)第一個參數(shù)出現(xiàn)位置的不同,第一個參數(shù)所綁定的對象略有區(qū)別。
》在構(gòu)造方法中引用該構(gòu)造方法正在初始化的對象。
》在普通實例方法中引用調(diào)用該方法的對象。
由于實例方法(包括構(gòu)造方法〉的第一個self 參數(shù)會自動綁定,因此程序在調(diào)用普通實例方法、構(gòu)造方法時不需要為第一個參數(shù)傳值。
假設(shè)定義了一個Dog 類,這個Dog 對象的run()方法需要調(diào)用它的jump()方法,此時就可通過self 參數(shù)作為jump()方法的調(diào)用者。
方法的第一個參數(shù)所代表的對象是不確定的,**但它的類型是確定的一一它所代表的只能是當前類的實例;**只有當這個方法被調(diào)用時,它所代表的對象才被確定下來誰在調(diào)用這個方法,方法的第一個參數(shù)就代表誰。
【可以聯(lián)想c++中用到的this也是一個指針,指向自己】
例子:
輸出:
this is mmyy2+ this is myy
Process finished with exit code 0
!!注意:當Python 對象的一個方法調(diào)用另一個方法時,不可以省略self。也就是說,將上面的self.myy()方法改為myy()是不正確的。
在構(gòu)造方法中, self 參數(shù)(第一個參數(shù))代表該構(gòu)造方法正在初始化的對象 例子:
class InConstructor def __init__(self):foo = 0self.foo = 6#在構(gòu)造方法中定義一個foo 變量(局部變量)#使用self 代表該構(gòu)造方法正在初始化的對象 #把該構(gòu)造方法正在初始化的對象的foo 實例變量設(shè)為6 這意味著該構(gòu)造方法運回的所有對象的foo實例變量都等于6類習題
1、以下類定義中哪些是類屬性,哪些是實例屬性?
class C:
num = 0
def init(self):
self.x = 4
self.y = 5
C.count = 6
num = 0 C.count = 6是類屬性 self.x = 4 self.y = 5是實例屬性
2.怎么定義私有?法?
用雙下劃線___
如def __num():
3、嘗試執(zhí)行以下代碼,并解釋錯誤原因:
class C:
def myFun():
print(‘Hello!’)
c = C()
c.myFun()
4、按照以下要求定義一個游樂園門票的類,并嘗試計算2個成人+1個小孩平日票價。
要求:
平日票價100元
周末票價為平日的120%
兒童票半價
結(jié)果:
一共價格250
Process finished with exit code 0
魔法方法
python中一個特別的內(nèi)容,需要深入掌握。
魔法方法總是被雙下劃線包圍,例如__init__
init(self[, …]) 構(gòu)造器,當一個實例被創(chuàng)建的時候調(diào)用的初始化方法
2.析構(gòu)方法: del
與init ()方法對應(yīng)的是__del__()方法’init()方法用于初始化Python 對象,而__del__()則用于銷毀Python 對象在任何Python 對象將要被系統(tǒng)回收之時,系統(tǒng)都會自動調(diào)用該對象的_del_()方法。
當程序不再需要一個Python 對象時,系統(tǒng)必須把該對象所占用的內(nèi)存空間釋放出來,這個過程被稱為垃圾回收Python 會自動回收所有對象所占用的內(nèi)存空間,因此開發(fā)者無須關(guān)心對象垃圾回收的過程。
3.dir
對象的dir ()方法用于列出該對象內(nèi)部的所有屬性(包括方法)名,該方法將會返回包含所有屬性(方法)名的序列。
當程序?qū)δ硞€對象執(zhí)行di r(object) 函數(shù)時,實際上就是將該對象的__dir__()方法返回值進行排序,然后包裝成列表。
4.__diet__屬性用于查看對象內(nèi)部存儲的所有屬性名和屬性值組成的字典, 通常程序直接使用該屬性即可。程序使用__diet__屬性既可查看對象的所有內(nèi)部狀態(tài), 也可通過字典語法來訪問或修改指定屬性的值
5.如果開發(fā)者需要實現(xiàn)迭代器,只要實現(xiàn)如下兩個方法即可。
iter(self) : 該方法返回一個法代器( iterator ),迭代器必須包含一個next () 方法,該方法返回迭代器的下一個元素。
reversed (self) : 該方法主要為內(nèi)建的reversed()反轉(zhuǎn)函數(shù)提供支持,當程序調(diào)用reversed()函數(shù)對指定迭代器執(zhí)行反轉(zhuǎn)時,實際上是由該方法實現(xiàn)的
如果程序不需要讓迭代器反轉(zhuǎn)迭代,其實只需要實現(xiàn)第一個方法即可。
魔法方法習題
1、上面提到了許多魔法方法,如__new__,init, str,rstr,getitem,__setitem__等等,請總結(jié)它們各自的使用方法。
new init str上面已有總結(jié),
getitem (self, key):該方法獲取指定索引對應(yīng)的元素。該方法的key 應(yīng)該是整數(shù)值或slice對象,否則該方法會引發(fā)KeyError 異常。
setitem (self, key, value) : 該方法設(shè)置指定索引對應(yīng)的元素。該方法的key 應(yīng)該是整數(shù)
值或slice 對象,否則該方法會引發(fā)KeyError 異常。
rstr:隨機生成字符串
import rstr
print(rstr.rstr(‘nice’))
iccic
print(rstr.rstr(‘nice’))
eeeeii
print(rstr.rstr(‘nice’,5))
icenc
可見每次輸出的結(jié)果都不一樣,可以有第二個參數(shù)來指定輸出的字符個數(shù)
2、利用python做一個簡單的定時器類
要求:
定制一個計時器的類。
start和stop方法代表啟動計時和停止計時。
假設(shè)計時器對象t1,print(t1)和直接調(diào)用t1均顯示結(jié)果。
當計時器未啟動或已經(jīng)停止計時時,調(diào)用stop方法會給予溫馨的提示。
兩個計時器對象可以進行相加:t1+t2。
只能使用提供的有限資源完成。
python的time模塊不太了解,混亂地寫了一下:
class timee:judge = Falsedef start(self):self.judge = Truedeftime = time.time()return deftimedef end(self):if self.judge == False:print('還未開始計時!')returnelse:endtime = time.time()return endtimedef now(self):print('現(xiàn)在時間' + str(time.localtime()))print(time.time())time.sleep(5)print(time.time())if __name__ == '__main__':t1 = timee()t1.end()t1.start()t1.end()t1.now()t2 = timee()print("")t2.start()print(t2.end()+t1.end())結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的python 类 对象 魔法方法概念+习题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot项目中的注解 启动项
- 下一篇: 【python笔记】python模块 d