Python 基础 装饰器,python基础装饰器

说起装饰器,就只可以说python自带的八个装饰器:

Python 基础 装饰器,python基础装饰器

   
后天把学过的装饰器的学问张开追思一下,提起装饰器,第二反响就是以此事物啊正是用来装X的,为何那样说吗,是应为没有那些东西还能干活,大多数做事都以能够做的,不管怎样依然把学过的夸口器梳理一下吗。

    壹、装饰器是个怎么样鬼?

       
装饰的意味啊,就是修饰,装点的意思能够给其余函数加多新的机能,器呢便是函数的情趣,so
装饰器就是为别的函数增加新的功效的函数。

    二、作为3个装饰器,他、它有怎么样的条条框框吧?  

        1.不改造被点缀函数的源代码(开放封闭原则)

        2.为棉被服装饰函数增添新功能后,不变被修饰函数的调用格局

    三、怎样贯彻七个装饰器呢?

       
要贯彻2个得以动用的装饰器就必要满意:装饰器=高阶函数+函数嵌套+闭包

    四、高阶函数

       
上节介绍完了哪些是高阶函数,只要满足:1.函数方可承受函数名当参数举行传递
二.函数的再次来到值可以回来2个函数名 
只要能够满意上边的别的一条就觉着构成的那个函数是高阶函数

        高阶函数的例子:

def foo():
    print('我的函数名作为参数传给高阶函数')
def gao_jie1(func):
    print('我就是高阶函数1,我接收的参数名是%s' %func)
    func()

def gao_jie2(func):
    print('我就是高阶函数2,我的返回值是%s' %func)
    return func

gao_jie1(foo)
gao_jie2(foo)
输出的结果是:
我就是高阶函数1,我接收的参数名是<function foo at 0x006896A8>
我的函数名作为参数传给高阶函数
我就是高阶函数2,我的返回值是<function foo at 0x006896A8>

#高阶函数应用1:把函数当做参数传给高阶函数
import time
def foo():
    print('from the foo')

def timmer(func):
    start_time=time.time()
    func()
    stop_time=time.time()
    print('函数%s 运行时间是%s' %(func,stop_time-start_time))
timmer(foo)
#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式

把函数当做参数传给高阶函数

#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
import time
def foo():
    print('from the foo')

def timmer(func):
    start_time=time.time()
    return func
    stop_time=time.time()
    print('函数%s 运行时间是%s' %(func,stop_time-start_time))
foo=timmer(foo)
foo()
#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

函数返回值是函数名

5、函数嵌套(正是函数中还有定义函数)

def father(name):
    print('from father %s' %name)
    def son():
        print('from son')
        def grandson():
            print('from grandson')
        grandson()
    son()

father('还是牛')

陆、闭包:(在四个成效域中放入的概念变量,就好像打了3个包)

#闭包的概念:闭就是封装的意思,就是把变量分装起来;包:就是层的意思,与之前作用域意思是一样的。
#grandson中的变量有name(形式参数);son中的变量有grandson(函数名也是变量);father中的变量有:name(形式参数) son
def father(name):
    print('from the father %s' %(name))
    def son():
        print('from the son')
        def grandson():
            print('from the grandson %s'%(name))
        grandson()
    son()

father('SB')

7、装饰器的为主框架

def timmer(func):
    def wrapper():
        print(func)
        func()
    return wrapper

def boo():
    print('你就是个傻逼!')


res = timmer(boo) # 返回的是wrapper的内存地址 <function timmer.<locals>.wrapper at 0x02129420>
#print(res)
res() #是在执行wrapper 函数

8、装饰器的二种样式:

先是种 无参数的装饰器

user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]

current_user={'username':None,'login':False}

def auth_deco(func):
    def wrapper(*args,**kwargs):
        if current_user['username'] and current_user['login']:
            res=func(*args,**kwargs)
            return res
        username=input('用户名: ').strip()
        passwd=input('密码: ').strip()

        for index,user_dic in enumerate(user_list):
            if username == user_dic['name'] and passwd == user_dic['passwd']:
                current_user['username']=username

                current_user['login']=True
                res=func(*args,**kwargs)
                return res
                break
        else:
            print('用户名或者密码错误,重新登录')

    return wrapper

@auth_deco
def index():
    print('欢迎来到主页面')

@auth_deco
def home():
    print('这里是你家')

def shopping_car():
    print('查看购物车啊亲')

def order():
    print('查看订单啊亲')

print(user_list)
# index()
print(user_list)
home()

其次种 含有参数的装饰器

user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]

current_user={'username':None,'login':False}
def auth(auth_type='file'):
    def auth_deco(func):
        def wrapper(*args,**kwargs):
            if auth_type == 'file':
                if current_user['username'] and current_user['login']:
                    res=func(*args,**kwargs)
                    return res
                username=input('用户名: ').strip()
                passwd=input('密码: ').strip()

                for index,user_dic in enumerate(user_list):
                    if username == user_dic['name'] and passwd == user_dic['passwd']:
                        current_user['username']=username
                        current_user['login']=True
                        res=func(*args,**kwargs)
                        return res
                        break
                else:
                    print('用户名或者密码错误,重新登录')
            elif auth_type == 'ldap':
                print('巴拉巴拉小魔仙')
                res=func(*args,**kwargs)
                return res
        return wrapper
    return auth_deco


#auth(auth_type='file')就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type='file')
#就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type='file'参数
@auth(auth_type='ldap')
def index():
    print('欢迎来到主页面')

@auth(auth_type='ldap')
def home():
    print('这里是你家')

def shopping_car():
    print('查看购物车啊亲')

def order():
    print('查看订单啊亲')

# print(user_list)
index()
# print(user_list)
home()

 

 

一、@property  
将某函数,做为属性使用

 

 

       

http://www.bkjia.com/Pythonjc/1208960.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/1208960.htmlTechArticlePython 基础 装饰器,python基础装饰器
昨日把学过的装饰器的学识打开追思一下,聊到装饰器,第一影响正是以此东西吧就是用来装X的,为…

 @property 修饰,就是将艺术,变成两性子能来接纳。

class A():


    @property
    def pfunc(self):
        return self.value

    @pfunc.setter
    def pfunc(self,value):
        self.value = value

    @property
    def pfunc1(self):
        print('this is property')

if __name__=="__main__":

    A.pfunc = 9
    print A.pfunc
    A.pfunc1

 

2、@classmethod
 修饰类的方式

带修饰类方法:cls做为方法的率先个参数,隐式的将类做为对象,传递给艺术,调用时决不实例化。

一般函数方法:self做为第2个参数,隐式的将类实例传递给艺术,调用方法时,类必须实例化。

class A():
    def func(self,x,y):
        return x * y

    @classmethod
    def cfunc(cls,x,y):
        return x * y

if __name__=="__main__":
    print A().func(5,5)
    print A.cfunc(4,5)

 

3、@staticmethod
 修饰类的主意

1)是把函数嵌入到类中的1种艺术,函数就属于类,同时注解函数不须要拜访那几个类

 2)使用修饰服,修饰方法,不供给实例化

 

class A():
    def func(self,x,y):
        return x * y


    @staticmethod
    def sfunc(x,y):
        return x * y


if __name__=="__main__":

    print A.sfunc(6,5)

 

 

Linux and
python学习调换一,2群已满.

Linux and
python学习沟通三群新开,接待加入,一同学习.qq 叁群:5632278九四

不前进,不倒退,甘休的场馆是绝非的.

共同发展,与君共勉,

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图