魚C-python之魔法方法

何為魔法方法?

魔法方法總是被雙下劃線包圍,例如:__init__

>>> class Rec:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def getPerl(self):
        return (self.x + self.y) * 2
    def getArea(self):
        return self.x * self.y
>>> 
>>> rec =Rec(2,3)
>>> rec.getPerl()
10
>>> rec.getArea()
6
>>>

構造和析構

重寫 __new__ 方法,返回的是一個實例化對象,一般我們是不需要去重寫的,python會自動的調(diào)用方法,但是有一種情況我們會去重寫他,就是當繼承一個類又要修改這個類的時候就需要重寫了。
例子:

        
>>> class CapStr(str):
    def __new__(cls,string):
        string = string.upper() #傳入的參數(shù)變?yōu)榇髮?        return str.__new__(cls,string)

    
>>> a =CapStr('I love you !')
>>> a
'I LOVE YOU !'

解釋:上面的 CapStr 方法繼承 str,由于 str 是一個不可以改變的類型,我們要改變 CapStr 的功能(傳入的參數(shù)變?yōu)榇髮懀┑脑挘荒苤貙戇@個方法 。 在 new方法中 我們做了 string = string.upper() 就是重寫方法傳給了 string,然后再后面一句把 string作為參數(shù) 返回。

__del()__方法 是析構器。當對象要被銷毀的時候這個方法就會別調(diào)用。python的垃圾回收機制回收不被使用的對象的時候 就會調(diào)用 del方法。

還有哪些魔法方法呢?參考一下小甲魚寫的 Python魔法方法詳解


定時器例子:

import time as t

class  Mytimer():
    def __init__(self):
        self.unit = ['年','月','天','小時','分','秒']
        self.prompt = '未開始計時'
        self.lasted = []
        self.begin = 0
        self.end = 0
        
    def __str__(self):
        return self.prompt

    __repr__ = __str__

    def __add__(self,other):
        prompt = '總共運行了'
        result =[]
        for index in range(6):
            result.append(self.lasted[index] + other.lasted[index])
            if result[index]:
                prompt += (str(result[index]) + self.unit[index])

        return prompt
    
    #開始計時
    def start(self):
        self.begin = t.localtime()
        self.prompt = '提示:請先調(diào)用stop()停止計時'
        print("計時開始....")

    # 停止計時
    def stop(self):
        if  not self.begin:
            print("提示:請先調(diào)用start() 進行計時")
        else:
            self.end = t.localtime()
            self._calc()
            print("計時結束....")

    # 內(nèi)部方法計算運行時間
    def _calc(self):
        self.lasted = []
        self.prompt = '總共運行了'
        for index in range(6):
            self.lasted.append(self.end[index]-self.begin[index])
            if self.lasted[index]:
                self.prompt += str(self.lasted[index]) + self.unit[index]
        #為下一輪計時初始化變量
        self.begin = 0
        self.end =0

運行后調(diào)用方法;

>>> 
====================== RESTART: D:/Python35/c/timer.py ======================
>>> f1 = Mytimer()
>>> f1
未開始計時
>>> f1.start()
計時開始....
>>> f1.stop()
計時結束....
>>> f1
總共運行了4秒
>>> f2 =Mytimer()
>>> f2
未開始計時
>>> f2.start()
計時開始....
>>> f2.stop()
計時結束....
>>> f1 + f2
'總共運行了8秒'
>>> 
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 1、什么叫魔法方法? 魔法方法:Python解釋器自動給出默認的,是可以給你的類增加魔力的特殊方法。如果你的對象實...
    Bling_ll閱讀 1,069評論 0 2
  • 兩本不錯的書: 《Python參考手冊》:對Python各個標準模塊,特性介紹的比較詳細。 《Python核心編程...
    靜熙老師哈哈哈閱讀 3,386評論 0 80
  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,626評論 1 118
  • 在python中,有一些內(nèi)置好的特定的方法,這些方法在進行特定的操作時會自動被調(diào)用,稱之為魔法方法,下面介紹幾種常...
    LittlePy閱讀 22,067評論 5 32
  • 日本女人向來以溫順著稱,似乎男人一下班,女人就跪著把鞋連忙遞了過去。說話永遠輕言輕語,從不大聲違抗丈夫的意愿。這些...
    herplus閱讀 544評論 0 2