美文网首页
面向对象进阶--魔术方法

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

作者: 测试探索 | 来源:发表于2022-11-24 21:59 被阅读0次

    一:魔术方法

    魔术方法都不需要手动调用,都是在特殊的情况下触发的。在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

    相关文章

      网友评论

          本文标题:面向对象进阶--魔术方法

          本文链接:https://www.haomeiwen.com/subject/fkmwxdtx.html