python高级编程之装饰器02

#装饰器02

#参数检查

#主要是用在接收或者返回函数,在特定上下文执行时可能有用

#例如:有一个函数通过XML-RPC调用,python将不能和静态类语言中一样直接提供它的完整签名,当XML-RPC客户要求函数签名时,就需要这样的能力

"""

xml-rpc相关学习:http://zh.wikipedia.org/wiki/XML-RPC

"""

#装饰器能提供这种签名类型,并确保输入输出与此有关,如下

from itertools import *

rpc_info={}

def xml_rpc(in_=(),out=(type(None),)):

def _xml_rpc(function):

#注册签名

func_name=function.func_name

rpc_info[func_name]=(in_,out)

def _check_type(ele,types):

"""subfybctuib tgat cgecjs tge types"""

if len(ele)!=len(types):

raise  TypeError(‘argument count is wrong‘)

typed=enumerate(izip(ele,types))

for index,couple in typed:

arg,of_right_type=couple

if isinstance(arg,of_right_type):

continue

raise  TypeError(‘arg #%d should be %s‘%(index,of_right_type))

#封装函数

def __xml_rpcs(*args):#没能允许关键字

#检查输入的内容

checkable_atrgs=args[1:]#removing self

_check_type(checkable_atrgs,in_)

#执行函数

res=function(*args)

#检查输出内容

if not type(res) in (tuple,list):

checkable_atrgs=(res,)

else:

checkable_atrgs=res

_check_type(checkable_atrgs,out)

#函数及其类型检查成功

return res

return __xml_rpcs

return _xml_rpc

#装饰器将该函数注册到全局字符中,并为其参数和返回值保存一个类型列表,注意Lyynwbiovwdt了很大的简化,

#例子;

class R(object):

@xml_rpc(int,int)#two int --None

def meth1(self,int1=1,int2=1):

print ‘received%d and %d‘%(int1,int2)

@xml_rpc((str,),(int,))#string--int

def meth2(self,phrease):

print ‘received%s‘%(phrease)

return 12

print rpc_info#{‘meth12‘: (<type ‘int‘>, <type ‘int‘>), ‘meth2‘: ((<type ‘str‘>,), (<type ‘int‘>,))}

my1=R()

my1.meth1(1,2)

my1.meth2(2)

这个例子有问题,如果看到的朋友,帮我指出来,在这先谢谢了

python高级编程之装饰器02

时间: 2024-10-04 13:14:41

python高级编程之装饰器02的相关文章

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 函数式编程、装饰器以及一些相关概念简介

Python 中的 Decorator(装饰器) 是对一个函数或者方法的封装,从而使其可以完成一些与自身功能无关的工作. 预备知识 一切皆对象 在 Python 中,所有的一切都被视为对象,任何的变量.函数.类等都是 object 的子类.因此除了变量之外,函数和类等也可以被指向和传递. >>> def foo(): ... pass ... >>> def Foo(): ... pass ... >>> v = foo >>> v

Python高级--闭包与装饰器

前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能.如权限认证. 一.如何定义闭包 1.闭包就是两个嵌套的函数,外层函数返回内层函数的引用,而且外层函数必须携带参数!为什么外层函数必须要有参数呢?可以思考一下! 基本格式如下: 1 def outer_fun(func): 2 def inner_fun(): 3 pass 4 return inner_fun 2.与普通函数的区别: 闭包的外层函数的变量可以在内存中

python高级编程-Part3 修饰器前奏

修饰器用来包装函数,增加额外的功能,而且应能够修饰一批函数,减少代码重用. 简单的修饰器 一个函数接收函数对象作为参数,并且返回函数对象,这样的函数可以成为一个修饰器,形如下面的定义: def deco(func):     def _deco(*args):         print "do something"         func(*args)     return _deco 上面的修饰器中,func称为被修饰的函数,在执行func前做一些额外的初始化工作. 修饰器定义完

python高级编程之超类02:super的缺陷

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #当使用多重继承层次结构时,再使用super的时候是非常危险的,主要是因为类的初始化,基类不在__init__中被隐式调用 #1滥用super和传统调用 #来自james knight(http://funm.net/super-harmful)示例中,类C使用__init__方法调用其基类,这样类B被调用2次 class A(object): def __init

python高级编程:有用的设计模式2

# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一个代价昂贵或者远程的资源提供了一个非直接访问的机制 在客户和主意之间,如图.它用来优化对高代价主题的访问,比如,在前一章中描述的memoize装饰器可以被认为是一个代理 ,它还可以用提供到一个主题智能访问,例如,大的视频文件可以封闭在代理中,以避免在用户仅仅请教其标题时就将文件载入到内存中 urllib2出给

python高级编程:有用的设计模式1

# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言相关解决识方案,最近最流行的书籍:"""gamma.heim.johson和vlissides a.k.a"四人组(gof)"编写的elements of reusable object-oriented software(中文:<设计模式:可复用面向对

Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Generator Function的示例,这一小节,我们会介绍Python的coroutine,以及会有一个小例子,再接下来的文章中会以代码的形式一步步介绍coroutine的高级用法. coroutine(协程) 什么是coroutine?coroutine跟Generator有什么区别?下面先看一段