python面试装饰器_不学会装饰器,面试不敢说自己会Python

@logger

def func:

pass

3.一般用来做什么?

装饰器可以在不修改函数的情况下,增加额外的功能.这是官方给 装饰器的定义

实际上我们会把一些业务功能之外的,附属需求用装饰器来实现.比如:为我们的函数添加 日志记录, 性能监控器, 埋点计数器.大家也都知道,修改写好的函数是非常麻烦并且容易出错的一件事.所以很适合" 在不修改函数内部代码的前提下,为它包装一些额外的功能"也就是装饰器

4.常用的装饰器

staticmethod用来修饰类中的方法,使得该方法可以直接用类名访问,如cls.foo。

classmethod和staticmehod类似,区别在于staticmethod,classmethod会将class传入被修饰的方法中

classA(object):

a =1

def__init__( self):

self.a =2

@staticmethod

deffoo1:

print A.a

@classmethod

deffoo2(cls):

print "class a is", cls.a

print "instance a is", cls.a

property可以将属性的访问和赋值用函数来实现,从而可以在函数里添加参数检查等一些功能,同时外部使用时访问和赋值的方式并不发生变化。注意访问和赋值的方法名是一样的

classA(object):

def__init__( self):

self.__count = 0

@property

defcount( self):

returnself.__count

@count.setter

defcount( self, value):

ifnotisinstance(value, int):

raise ValueError( 'count must be an integer!')

self.__count = value

a = A

print a.count

a.count = 1

print a.count

a.count = "a"# raise ValueError

functools.wraps 用在装饰器的代码里。可以把原始函数的 name等属性复制到wrapper函数中,这样就可以获取到真实函数的 name属性,而不是wrapper

import functools

deflog(text):

defdecorator(func):

@functools.wraps(func)

defwrapper( *args, **kw):

print '%s %s:'%(text, func. __name__)

returnfunc( *args, **kw)

returnwrapper

returndecorator

5.怎么手写一个装饰器

#!/anaconda3/envs/FEALPy/bin python3.7

# -*- coding: utf-8 -*-

# ---

# @File: 装饰器语法.py

# @Author: Bull

# ---

# 定义装饰器函数

# 1.简单装饰器范例

def logger(func):#在python里,一切都是对象

def wrapper(*args,**kw):

print("进入装饰器函数了")

func(*args,**kw)#真正的函数在装饰器重新调用

func(*args, **kw)

print("装饰器功能执行完毕")

return wrapper

@logger#=logger(add)

def add(x,y):

print('进入被修饰的函数')

print(f'{x}+{y}={x+y}')

# add(1,2)

# 2.带参数的装饰器

def say_hello(contry):

def wrapper(func):

def second(*args,**kw):

if contry == 'china':

print("来自装饰器的‘你好’")

elif contry == 'america':

print('来自装饰器的"hello"')

else:

return

func(*args,**kw)

return second

return wrapper

@say_hello('america')

def american:

print("I am from America")

@say_hello('china')

def china:

print('我来自中国')

american

print('*'*30)

china

推荐学习

码同学 Java全栈自动化,开课倒计时!

冲击年薪50W+!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值