何为魔法方法?
魔法方法总是被双下划线包围,例如:
__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会自动的调用方法,但是有一种情况我们会去重写他,就是当继承一个类又要修改这个类的时候就需要重写了。
例子:
>>> class CapStr(str):
def __new__(cls,string):
string = string.upper() #传入的参数变为大写
return str.__new__(cls,string)
>>> a =CapStr('I love you !')
>>> a
'I LOVE YOU !'
解释:上面的 CapStr 方法继承 str,由于 str 是一个不可以改变的类型,我们要改变 CapStr 的功能(传入的参数变为大写)的话,只能重写这个方法 。 在 new方法中 我们做了
string = string.upper()
就是重写方法传给了string
,然后再后面一句把string
作为参数 返回。
__del()__方法
是析构器。当对象要被销毁的时候这个方法就会别调用。python的垃圾回收机制回收不被使用的对象的时候 就会调用 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 = '提示:请先调用stop()停止计时'
print("计时开始....")
# 停止计时
def stop(self):
if not self.begin:
print("提示:请先调用start() 进行计时")
else:
self.end = t.localtime()
self._calc()
print("计时结束....")
# 内部方法计算运行时间
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
运行后调用方法;
>>>
====================== 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秒'
>>>