何為魔法方法?
魔法方法總是被雙下劃線包圍,例如:
__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秒'
>>>