当前位置: 首页>移动开发>正文

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

一:魔术方法

魔术方法都不需要手动调用,都是在特殊的情况下触发的。在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))
面向对象进阶--魔术方法,第1张
类创建出来的对象,不可调用

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))
面向对象进阶--魔术方法,第2张

三:通过类实现装饰器

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张

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)
面向对象进阶--魔术方法,第4张

https://www.xamrdz.com/mobile/48a1882599.html

相关文章: