【python进阶】python装饰器 以及三个内置装饰器(@staticmethod、@classmethod、@property)

本文介绍了Python装饰器的概念及其在不修改原代码基础上增加功能的优势。强调了@staticmethod和@classmethod的区别,前者允许无需实例化即可调用类方法,后者则需要cls参数代表类本身。同时,文章探讨了@property装饰器,用于将类方法转化为只读属性,提升代码组织和命名空间的整洁度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:https://foofish.net/python-decorator.html
python装饰器可以装饰一个函数。它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象


如果直接将函数作为参数传入到另外一个函数中。

def use_logging(func):
    logging.warn("%s is running" % func.__name__)
    func()

def foo():
    print('i am foo')

use_logging(foo)

功能是实现了,但是我们调用的时候不再是调用真正的业务逻辑 foo 函数,而是换成了 use_logging 函数,这就破坏了原有的代码结构, 现在我们不得不每次都要把原来的那个 foo 函数作为参数传递给 use_logging 函数


因此更好的解决办法是使用装饰器。

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper

def foo():
    print('i am foo')

foo = use_logging(foo)  # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于  foo = wrapper
foo()                   # 执行foo()就相当于执行 wrapper()

在这里插入图片描述


装饰器 @语法糖
下面这个代码与上面的代码是等效的。但是更加简洁明了

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()
    return wrapper

@use_logging
def foo():
    print("i am foo")

foo()

python常用的内置装饰器

参考:https://blog.youkuaiyun.com/chenzao123/article/details/79422002
在这里插入图片描述
基本用法:
在这里插入图片描述
@staticmethod是类静态方法,调用的时候不需要People(…).print_hello(“world”)
@classmethod调用的时候也不需要实例化,但是第一个参数必须是cls
@property将类方法变为一个只读的类属性


用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
例如上面print_hello()是类里面的函数,但是不需要类的参数参与。


self和cls区别

普通的方法,第一个参数需要是self,它表示一个具体的实例本身。
如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。
而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。
也就是说普通的方法,类里面的函数后面都有self,self表示具体的实例本身
对于staticmethod装饰器,函数参数里面self和cls都可以没有
对于classmethod装饰器,函数第一个参数为cls,表示这个类本身

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值