Python 面对对象(下):装饰器

1.什么是装饰器

        python装饰器就是用于拓展原来函数功能的一种函数。通过使用装饰器可以给函数或类增强功能,并且还可以还可以快速的给不同的函数或类插入相同的功能。

1.1定义装饰器

        想要在Python中使用装饰器就需要使用一个特殊的符号“@”来实现。在定义装饰器装饰函数或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类之前。例如·:

@ run_data
def han_fun():
    pass

        在Python程序中使用装饰器后,上述代码定义的函数han_fun()可以只定义自己所需要的功能,而装饰器所定义的功能会自动插入函数han_fun()中,这样就可以节约大量具有相同的函数或类的代码。即使是不同目的或不同类的函数或类,也可以插入完全相同的功能。

        装饰器的目的:

                        在不改变原函数的情况下,去增强函数的功能

如何去定义一个装饰器
        利用的是闭包

1.嵌套函数
功能是:用一个函数去增强另个一函数,
       增强:无非就是在执行原函数之前或者之后额外做一些其他的操作
2.因为会把原函数作为参数传给装饰器的函数
3.利用闭包原理:内层函数应用外层函数的变量(传入的装饰器函数的参数)
4.返回内层函数

 定义一个简单的装饰

def outer(func):            #传入要增强的函数func
    def inner():            #定义内层函数
        print("Action")
        func()
        print("After")
    return inner
def text():                #定义一个函数
    print("This is a text")

inner = outer(text)
inner()

输出:

 使用装饰器:

def outer(func):
    def inner():
        print("Action Before") 
        func()
        print("Action After")
    return inner

@outer
def test():
    print("This is a test")


test()

输出:

 1.2使用装饰器装饰函数

        

def zz(fun):                        #定义一个装饰器函数zz()
    def wrapper(*args, **kwargs):   #定义一个包装器函数wrapper()
        print("开始运行。。。")
        fun(*args, **kwargs)        #使用被装饰函数
        print("运行结束。。。。")
    return wrapper                  #返回包装器函数wrapper()

@zz                                 #装饰函数语句
def demo_decoration(x):             #定义普通函数,他被装饰器装饰
    a = []                          #定义空列表a
    for i in range(x):              #遍历x的值
        a.append(i)                 #将i添加到末尾列表
    print(a)

@zz
def hello(name):                    #定义普通函数,他被装饰器装饰
    print('hello', name)

if __name__ == '__main__':
    demo_decoration(5)              #调用被装饰器装饰的函数demo_decoration()
    print()
    hello('浪潮')                    #调用被装饰器装饰的函数hello()

输出结果:

 1.3使用装饰器装饰类

        代码如下:

def zz(myclass):                #定义一个能够装饰类的装饰器zz()
    class InnerClass:           #定义一个内嵌类InnerClass来代替被装饰的类
        def __init__(self, z = 0):      #构造函数
            self.z = 0
            self.wrapper = myclass()  #实例化被装饰的类

        def position(self):
            self.wrapper.position()
            print('z轴坐标', self.z)

    return InnerClass           #放回新定义的类

@zz                             #使用装饰器
class coordination:             #定义一个普通的方法coordination
    def __init__(self, x = 0, y = 0):
        self.x = x              #初始化x
        self.y = y              #初始化y
    def position(self):         #定义普遍方法position()
        print('x轴坐标', self.x)   #显示x轴坐标
        print('y轴坐标', self.y)   #显示y轴坐标

if __name__ == "__main__":          #当直接运行模块的时候,以下代码会执行,当导入模块时程序不会执行
    coo = coordination()
    coo.position()

输出:

 1.4给装饰器传值

def wrapper(arg):
    def outer(func):
        def inner(*args, **kwargs):
            print(arg,"Action Before")
            func(*args, **kwargs)
            print(arg, "Action After")
        return inner
    return outer

@wrapper("111")
def test(arg1):
    print("This is a test")
    

test(222)

输出:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值