面向对象进阶--魔术方法

一:魔术方法

魔术方法都不需要手动调用,都是在特殊的情况下触发的。在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)
image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容