python__高级 : 类当作装饰器

类在创建对象时,会调用 __init__ 初始化一些东西 , 然后 如果类中定义了 __call__ 方法,可以直接用  对象()  这种方法调用,所以可以用类来装饰函数:

class Test(object):
    def __init__(self, func):
        print(‘----装饰-----‘)
        print(‘func name is %s‘ % func.__name__)
        self.__func = func

    def __call__(self, *args, **kwargs):
        print(‘装饰器中的功能‘)
        self.__func()

@Test
def test():
    print(‘------test-------‘)

>>>----装饰-----
   func name is test

首先 @Test 就是   test = Test(test)  先创建了Test类的一个对象 这个时候 test 就不是指向函数了,而是一个 Test类的对象,传进去的参数 func 才是真正的 test 函数的引用,调用 __init__ 方法初始化之后,就是打印出来的效果.

然后如果调用  test() :

>>>----装饰-----
   func name is test
   装饰器中的功能
   ------test-------

因为现在 test是Test类的一个实例,所以 直接调用 test() 就相当于调用了 __call__ 方法 ,里面实现了打印一句话 以及调用传进去的 self.__func() 这个时候才执行了原本的 test 函数.

原文地址:https://www.cnblogs.com/cccy0/p/9060387.html

时间: 2024-07-31 06:36:30

python__高级 : 类当作装饰器的相关文章

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

python高级编程之装饰器01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #装饰器01 #特点是:使得函数和方法封装(接收一个函数并返回增强版本一个函数) #语法:原始场景可以将方法 在定义首部将其定义为类方法或者静态方法,在未使用装饰器之前,语法如下: class WhatFort(object): def it(cls): print 'work with %s:'%cls it=classmethod(it) def uncommo

python高级编程之装饰器02

#装饰器02 #参数检查 #主要是用在接收或者返回函数,在特定上下文执行时可能有用 #例如:有一个函数通过XML-RPC调用,python将不能和静态类语言中一样直接提供它的完整签名,当XML-RPC客户要求函数签名时,就需要这样的能力 """ xml-rpc相关学习:http://zh.wikipedia.org/wiki/XML-RPC """ #装饰器能提供这种签名类型,并确保输入输出与此有关,如下 from itertools impor

用类作为装饰器装饰函数!

在python中我们可以利用一个函数作为装饰器来装饰另一个函数,但是装饰器只能是函数吗 ?当然了我们还可以使用类来作为装饰器! class A(object): def __init__(self,func): print('定义初始化函数') print('func name is %s'%func.__name__) self.__func = func def __call__(self): print('call 方法作为装起中的功能') self.__func() print('增加的

Python进阶-----类的装饰器及应用

回顾什么是装饰器: 装饰器定义:本质就是函数(高阶函数),功能是为其他函数(对象)添加新功能 一.类的装饰器基本实现原理如下: 1 def deco(cls): 2 print('类的装饰器=========>') 3 print('='*20) 4 return cls 5 6 @deco #====> Foo = deco(Foo) 7 class Foo: 8 pass 二.上述的简单装饰器是没有参数的,现在我们加上参数 1 def cls_decorator(**kwargs): #支

19 描述符应用 与类的装饰器

上下文管理协议 class Open: def __init__(self,name): self.name = name def __enter__(self): print('执行enter') def __exit__(self, exc_type, exc_val, exc_tb): print('执行exit') with Open('a.txt') as f: print(f) print('______') print('00000') with open 执行了enter f为e

Python之旅的第28天(描述符、类的装饰器)

周末真好,时间充裕,都能按照要求自己练习,感觉就是好 一.描述符 上次针对描述符的内容,理解的非常不到位,所以我就特地找了新的内容好好看了看,总结一下就是下面这些 # 前天我大概知道类描述符的一些特性,以及什么是数据描述符和非数据描述符 # 今天白天没事琢磨了一下,顺便又看了看各种案例,貌似理解更深入了一些 # 数据描述符:就是这个类属性是由一个实现了__get__(),__set__(),__delete__()中方法的新式类搞定了 # 非数据描述符则是,没有__set__方法的 # 当时没有

python描述符、property、函数(类)装饰器实例解析

1 import sys 2 3 ''' 4 当使用实例对象访问属性时,都会调用__getattribute__内建函数 5 __getattribute__查找属性的优先级 6 1.类属性 7 2.数据描述符 8 3.实例属性 9 4.非数据描述符 10 5.__getattr__() 11 12 #实例.属性 13 c.x ==>type(x).__dict__['x'].__get__(x,type(x)) 14 #类.属性 15 C.x ==>X.__dict__['x'].__get

Python学习之路day4-函数高级特性、装饰器

一.预备知识 学习装饰器需理解以下预备知识: 函数即变量 函数本质上也是一种变量,函数名即变量名,函数体就变量对应的值:函数体可以作为值赋给其他变量(函数),也可以通过函数名来直接调用函数.调用符号即(). 嵌套函数 函数内部可以嵌套定义一层或多层函数,被嵌套的内部函数可以在外层函数体内部调用,也可以作为返回值直接返回 闭包 在一个嵌套函数中,内部被嵌套的函数可以调用外部函数非全局变量并且不受外部函数声明周期的影响(即可以把外部函数非全局变量视为全局变量直接调用). 高阶函数 把一个函数作为参数