一:魔术方法
魔术方法都不需要手动调用,都是在特殊的情况下触发的。在python中像 __init __ 这类双下划线开头和结尾的方法,我们把它统称为魔术方法,魔术方法都是python内部定义的。
二:_ _ call_ _ 魔术方法
2-1:前言:类对象是否可调用,通过callable进行验证
def work():
pass
class Demo():
pass
# 判断对象是否可调用==》函数callable()
print(callable(work))
print(callable(Demo))
# demo类创建出来的对象是否可以调用???
obj = Demo()
print("obj",callable(obj))
2-2:使用_ _ call _ _实现类创建的对象的可调用
def work():
pass
class Demo():
def __call__(self, *args, **kwargs):
"""
__call__:实现对象可调用
:param args:
:param kwargs:
:return:
"""
print("----call----方法执行了")
# 判断对象是否可调用==》函数callable()
# print(callable(work))
# print(callable(Demo))
# demo类创建出来的对象是否可以调用???
obj = Demo()
obj() #===>obj.__call_()_
print("obj可调用",callable(obj))
三:通过类实现装饰器
3-1:不带参数的装饰器
import time
class CountTime:
def __init__(self,func):
# func:是被装饰的函数,传入进来之后保存为func属性
self.func = func
def __call__(self, *args, **kwargs):
print("--cal--")
st = time.time()
# 调用原功能函数
self.func( *args, **kwargs)
et = time.time()
print("函数执行的时间为:",et-st)
@CountTime #==>work = CountTime(work) 实例化对象
def work():
time.sleep(2)
work()
print(work)
3-2:带参数的装饰器
import time
class CountTime:
def __init__(self,n):
# func:是被装饰的函数,传入进来之后保存为func属性
self.n = n
def __call__(self, func):
self.func = func
return self.run
def run(self,*args,**kwargs):
print("装饰器的功能代码1")
res = self.func(*args,**kwargs)
print("装饰器的功能代码1")
return res
@CountTime(3) #==>work = CountTime(work) 实例化对象
def work():
time.sleep(2)
print("----work-----")
work()
print("wor打印:",work)