Python 装饰器-基本概念

 

所谓装饰就是在被装饰的函数执行前/后执行一些额外的功能。

装饰器是用来对“装饰”进行封装的一种手段,让在被装饰函数执行前/后被执行的代码更简洁,复用性更高,对原来的代码变动最少。这一点同设计模式中的装饰器概念类似。面向方面(切面)编程中应用很多。

 

装饰器的实现依赖于Python语言的三个特征:1.函数参数;2函数返回值;3函数内嵌套定义函数。

装饰器封装代码的思路:创建一个函数返回一个函数,返回的函数对新增代码和被装饰的函数进行封装。通过调用这个返回的函数实现对新增代码和被装饰函数的调用。 可以将返回的函数赋值给和被装饰的函数同名的变量。 调用被装饰函数的代码不需要改动而实现新增功能。

 

Python的装饰器是一个函数,在该函数中创建并返回一个可以执行原函数和新增代码的函数。如下例:

def butter(func):
    def wrapper():
        print("*******Butter********")            
        func()
        return("Spreaded butter on bread")
    return wrapper

def bread():
    print('=======Bread=========')
    
bread=butter(bread)
Status=bread()
print(Status)

*******Butter********
=======Bread=========
Spreaded butter on bread

上面代码中我们需要手动的给被装饰的函数重新赋值:bread=butter(bread). Python对此提供了一个简便的语法(语法糖):在被装饰的函数定义前用@指明装饰函数,如:@butter,就可以直接调用被装饰函数而不需要重新赋值。上面代码等价下面代码:

def butter(func):
    def wrapper():
        print("*******Butter********")            
        func()
        return("Spreaded butter on bread")
    return wrapper
@butter
def bread():
    print('=======Bread=========')
Status=bread()
print(Status)

 

以上是自定义的装饰器,Python内部预定义了三个装饰器:staticmethod,classmethod和property

 

staticmethod:用于定义静态方法。 静态方法中只能访问类的其他类方法,静态方法和类变量,并且需要用加类名限定,形如:<ClassName>.<StaticMethodName|ClassMethodName|ClassVarable>。静态方法通过类名调用,不需要实例化对象,所以不需要传入self作为第一参数。类对象也能直接调用该类的静态方法。

classmethod:用于定义类方法。 类方法内部只能访问类的其他类方法,静态方法和类变量,并且需要用加类名限定,形如:<ClassName>.<StaticMethodName|ClassMethodName|ClassVarable> 或者cls.<StaticMethodName|ClassMethodName|ClassVarable>。类方法通过类名调用,不需要实例化对象,但因为需要访问类中其他类方法,变量,所以虽然不需要传入self作为第一参数,但要把cls作为第一参数。类对象也能直接调用该类的类方法。

下面代码对上述定义进行演示:

class voice():
    @staticmethod
    def speak(lang):
        return lang      
    @classmethod
    def setmsg(cls,lang):
        lang=voice.speak(lang)
        if lang=="CN":
            return "你好"
        elif lang=="EN":
            return "Hello"
        else:
            return "*&@#$!~$#%#&%"       
    @classmethod
    def sayHello(cls,lang):
        msg=cls.setmsg(lang)
        print(msg)
        
voice.sayHello("EN")
voice.sayHello("CN")
----输出----
Hello
你好

property用于将无参数且返回单值的方法定义为属性,可以简化访问。

当一个方法被确定为property后,相应的<PropertyName>.getter,<PropertyName>.setter和<PropertyName>.deleter三个装饰器便可用了。这三个装饰器分别对应属性的写,读,删除操作。property修饰的方法是默认的getter,入过定义了新的getter 则默认的getter失效。如下代码示例:

class car():
    __color="black"
    @property
    def color(self):
        return self.__color
    @color.getter
    def color(self):
        return "color"
    @color.setter
    def color(self, clr):
        self.__color=clr
    @color.deleter
    def color(self):
        del self.__color
c=car()
c.color="red"
print(c.color)

----输出----
color # 如果没有@color.getter装饰器,则会返回: red.

下一章:Python 装饰器-进阶

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的函数装饰器是一种特殊类型的函数,它可以用来修改其他函数的功能。装饰器可以在不修改被装饰函数源代码的情况下,为其添加额外的功能。装饰器本质上是一个返回函数的函数,它使用了闭包的概念Python提供了@符号作为装饰器的语法糖,使得应用装饰器更加方便。使用装饰器时,可以直接在被装饰函数的定义上方使用@符号加上装饰器函数的名称,就可以将被装饰函数作为参数传递给装饰器函数进行处理。 函数装饰器的应用场景很广泛,它可以用于添加日志记录、性能分析、权限验证、缓存等功能。通过使用装饰器,我们可以将这些功能从原始函数中分离出来,提高代码的可读性和可维护性。 以下是一个简单的示例,演示了如何使用函数装饰器: ``` def decorator(func): def wrapper(*args, **kwargs): # 添加额外的功能 print("装饰器添加的功能") # 调用原始函数 return func(*args, **kwargs) return wrapper @decorator def my_function(): print("原始函数") my_function() ``` 在上面的例子中,我们定义了一个装饰器函数`decorator`,它接受一个函数作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数中,我们可以添加额外的功能,并调用原始函数。通过使用`@decorator`语法,我们将`my_function`函数传递给装饰器进行处理。 当我们调用`my_function()`时,实际上调用的是装饰器返回的`wrapper`函数。在执行`wrapper`函数之前,会先执行装饰器添加的额外功能,然后再调用原始函数。 这就是Python函数装饰器的基本原理和用法。通过使用装饰器,我们可以轻松地修改函数的功能,使代码更加简洁和可重用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值