python中的修饰符

函数修饰符

函数修饰符的作用是为现有函数增加额外的功能,比如日志插入、性能测试等。

创建函数修饰符的规则有以下四点:

  1. 修饰符是一个函数;
  2. 被修饰函数是修饰符的参数;
  3. 修饰符返回一个新函数;
  4. 修饰符维护被维护函数的签名(原函数还是按照以前的标识符调用,但功能多了一些);

被修饰函数不带参数

我们有一个函数用于计算1到10000的整数和:

def sum():
    total = 0
    for i in range(1,10001):
        total += i
    print(total)

我们希望能得到这个函数的运行时间,但是又不希望对函数sum进行修改,于是,我们运用修饰符。

import time
def calculate_time(func):
    def wrapper():
        t1 = time.time()
        func()
        t2 = time.time()
        spend = t2 - t1
        print(f'花费的时间是{spend}s')
    return wrapper

@calculate_time
def sum():
    total = 0
    for i in range(1,10001):
        total += i
    print(total)
        
if __name__ == '__main__':
    sum()

输出的结果是:
50005000
花费的时间是0.0006659030914306641s

wrapper才是最终起到作用的函数,也就是说,修饰函数内部的一切,是sum需要执行的。

修饰函数的参数是函数。

我们查看sum函数的name,发现其实际上正式wrapper

print(sum.__name__)

输出的结果是:
wrapper

被修饰函数带参数

另外,被修饰函数还有返回值。

import time
def calculate_time(func):
    def wrapper(*args,**kwargs):
        t1 = time.time()
        ret = func(*args,**kwargs)
        t2 = time.time()
        spend = t2 - t1
        print(f'花费的时间是{spend}s')
        return ret
    return wrapper

@calculate_time
def sum(start,end):
    total = 0
    if end > start :
        for i in range(start,end+1):
            total += i
    print(total)
    return total
        
if __name__ == '__main__':
    total = sum(1,10000)

改动有两点:

  1. wrapper函数和func函数都加上了参数;
  2. wrapper函数给予了return。

实验表明,参数改为(start,end)也可以,但比较有针对性。

类修饰符

@classmethod

class A(object):
	bar = 1
	def __init__(self,name):
		self.name = name
	@classmethod
	def printf(cls): # cls参数是默认传递进去的
		print(cls.bar)

if __name__ == "__main__":
	A.printf()

被修饰的函数不需要类实例化,也不需要self参数,但第一个参数需要是表示自身类的cls参数。

@property

class A(object):
	def __init__(self,name):
		self.name = name
	@property
	def print():
		print('100')

if __name__ == "__main__":
	A.print

被修饰对象不需要加括号就可以直接调用。

@classmethod和@staticmethod的区别

有关类的方法分为三种,分别是:

  1. 静态方法(staticmethod)
  2. 类方法(classmethod)
  3. 实例方法

带有self的,就是实例方法,需要将类实例化之后,才可以调用一个函数。

区别:

  1. staticmethod不需要表示自身对象的self和自身类的cls参数,和使用函数一样;classmethod不需要self参数 但是需要cls参数。
  2. 如果在staticmethod中调用这个类的一些属性方法,只能直接 类名.属性名或类名.方法名;而classmethod之因为持有cls参数,可以直接调用类的属性、类的方法。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

右边是我女神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值