3、黑魔法杂货铺

2023-12-31 08:20
文章标签 杂货铺 黑魔法

本文主要是介绍3、黑魔法杂货铺,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

装饰器

# 验证session的装饰器, 在web框架中可以重复使用
def authForm(func):def wrapper(request, *args, **kwargs):if request.session.get['username']:return func(request, *args, **kwargs)else:return render(request, 'login.html')return wrapper# 为函数执行前和函数执行后增加功能的装饰器
def filter(before_func, after_func):def outer(main_func):def wrapper(request, *args, **kwargs):before_result = before_func(request, *args, **kwargs)if before_func != None:return before_resultmain_result = main_func(request, *args, **kwargs)if main_result != None:return main_resultafter_result = after_func(request, *args, **kwargs)if after_result != None:return after_resultreturn wrapper()return outer()#==========两个实用的Python的装饰器实例=========#
# 第一式:超时函数
'''这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,
这个功能在编写外部API调用 、网络爬虫、数据库查询的时候特别有用。timeout装饰器的代码如下:'''
# 下面会用到signal, functools两个库, 定义一个Exception,后面超时抛出
class TimeoutError(Exception):passdef timeout(seconds, error_message = 'Function call timed out'):def decorated(func):def _handle_timeout(signum, frame):raise TimeoutError(error_message)def wrapper(*args, **kwargs):signal.signal(signal.SIGALRM, _handle_timeout)signal.alarm(seconds)try:result = func(*args, **kwargs)finally:signal.alarm(0)return resultreturn functools.wraps(func)(wrapper)return decorated# 使用:限定下面的slowfunc函数如果在5s内不返回就强制抛TimeoutError Exception结束
@timeout(5)
def slowfunc(sleep_time):time.sleep(sleep_time)  #这个函数就是休眠sleep_time秒

slowfunc(3)     #sleep 3秒,正常返回没有异常
slowfunc(10)    #被终止# 第二式:Trace函数
'''有时候出于演示目的或者调试目的,我们需要程序运行的时候打印出每一步的运行顺序和调用逻辑。
类似写bash的时候的bash -x调试功能,然后Python解释器并没有内置这个十分有用的功能。
Trace装饰器的代码如下:'''
def trace(f):def globaltrace(frame, why, arg):if why == "call":return localtracereturn Nonedef localtrace(frame, why, arg):if why == "line":# record the file name and line number of every tracefilename = frame.f_code.co_filenamelineno = frame.f_linenobname = os.path.basename(filename)print("{}({}): {}".format(bname,lineno,linecache.getline(filename, lineno)),)return localtracedef _f(*args, **kwds):sys.settrace(globaltrace)result = f(*args, **kwds)sys.settrace(None)return resultreturn _f# 使用:
@trace
def xxx():print(1)print(22)print(333)
decorator

 

闭包

def make_addr(adden):def addr(args):return args + addenreturn addrm1 = make_addr(23)
m2 = make_addr(44)>>> print(m1(100))
123
>>> print(m2(100))
144
closure

 

反射

class Student(object):@propertydef birth(self):return self._birthday@birth.setterdef birth(self, birthday):self._birthday = birthdays = Student()
s.birth = 29
print(s.birth)# 下面这个例子更加清楚简洁的使用了__getattr__和__setattr__
# JsonDict继承dict类,重写dict类__getattr__和__setattr__方法
class JsonDict(dict):def __init__(self, **kw):super().__init__(**kw)def __getattr__(self, attr):try:return self[attr]except KeyError:raise AttributeError(r"'JsonDict' object has no attribute '%s'" % attr)# 可以重写dict,使之通过"."调用def __setattr__(self, attr, value):self[attr] = valuej = JsonDict(name='python', age='28')
print(j)
print(j.name)
print(j.age)"""现在很多网站都搞REST API,比如新浪微博、豆瓣啥的,调用API的URL类似:
http://api.server/user/friends
http://api.server/user/timeline/list
如果要写SDK,给每个URL对应的API都写一个方法,那得累死,而且,API一旦改动,SDK也要改。
利用完全动态的__getattr__,我们可以写出一个链式调用:"""class Chain(object):def __init__(self, path=''):self._path = path# 所有Chain.xx的方法都能通过,可以使用raise AttributeError可以限制传入的参数def __getattr__(self, path):return Chain('%s/%s' % (self._path, path))def __str__(self):return self._path__repr__ = __str__def test(self):pass# 测试结果如下:
"""
>>> Chain().status.user.timeline.list
'/status/user/timeline/list'
>>> Chain(http://api.server).status.user.timeline.list
'http://api.server/status/user/timeline/list'
"""c = Chain()
print(hasattr(c, 'best'))
print(getattr(c, 'best'))
reflex

 

转载于:https://www.cnblogs.com/raykuan/p/6130015.html

这篇关于3、黑魔法杂货铺的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/555478

相关文章

黑魔法-伪类匹配列表数目实现微信群头像CSS布局的技巧

一、不同列表数量不同布局 这是群里有人问的一个问题,可能其他人也有类似需求,因此拿出来给大家分享分享。 聊天软件中的群头像,或者一些书籍的分组,往往采用复合头像作为一个大的头像。 可以看到,头像数目不同,布局也跟着不同。 常规操作 一般大家会实现类似下面的方法实现布局效果: <ul class="box" data-number="1"></ul><ul class="box"

【C++杂货铺】海量数据处理(位图、布隆过滤器)

目录 🌈前言🌈 📁 位图  📂 概念 📂 模拟实现 📂 C++中位图  📂 位图的优缺点 📁 布隆过滤器  📂 概念  📂 模拟实现  📂 应用场景 📁 海量数据处理 📁 总结 🌈前言🌈         本期【C++杂货铺】,将介绍关于哈希表的扩展内容,即位图和布隆过滤器,以及如何通过位图和布隆过滤器解决海量数据处理问题。

算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)

2010-09-18 22:50 by T2噬菌体, 20383 阅读, 18 评论, 收藏 , 编辑 2.1、摘要       在上一篇文章中我们讨论了朴素贝叶斯分类。朴素贝叶斯分类有一个限制条件,就是特征属性必须有条件独立或基本独立(实际上在现实应用中几乎不可能做到完全独立)。当这个条件成立时,朴素贝叶斯分类法的准确率是最高的,但不幸的是,现实中各个特征属性间往往并不条件独立

PHP杂货铺家庭在线记账理财管理系统源码

家庭在线记帐理财系统,让你对自己的开支了如指掌,图形化界面操作更简单,非常适合家庭理财、记账,系统界面简洁优美,操作直观简单,非常容易上手。 安装说明: 1、上传到网站根目录 2、用phpMyadmin导入数据库文件sjk.sql 3、修改数据库链接文件 /data/config.php (记得不要用记事本修改,否则可能会出现验证码显示不了问题,建议用Notepad++) 4、帐号 admin

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(五)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初,目前单靠 SwiftUI 这是不可能完成的任务!那么我们是如何实现的呢? 在本篇博文中,您

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(三)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初,目前单靠 SwiftUI 这是不可能完成的任务!那么我们是如何实现的呢? 在本篇博文中,您

【Linux杂货铺】进程通信

目录 🌈 前言🌈 📁 通信概念 📁 通信发展阶段 📁 通信方式 📁 管道(匿名管道) 📂 接口 ​编辑📂 使用fork来共享通道 📂 管道读写规则 📂 管道特征 📁 命名管道 📂 接口 📂 管道和命名管道的区别 📁 System V IPC 📁 共享内存  📂 原理 📂 接口 📁 消息队列 📁 信号量 📂 进程互

Qt moc系统的黑魔法?

Qt的元对象系统(Meta-Object System)是Qt框架的核心功能之一,为C++语言增加了一些动态特性,借助元对象系统Qt可以实现以下功能 信号与槽机制(Signals and Slots)运行时类型信息(Run-Time Type Information, RTTI)属性系统(Property System)动态对象创建(Dynamic Object Creation)动态方法调用(

PHP黑魔法之md5绕过

php本身是一种弱语言,这个特性决定了它的两个特点: 输入的参数都是当作字符串处理变量类型不需要声明,大部分时候都是通过函数进行类型转化 php中的判断有两种: 松散比较:只需要值相同即可,类型不必相同,不通类型比较会先转化为同类型,比如全数字字符串和数字比较,会比较两个变量的数字值是否相同。严格比较:类型和值都要比较,有一个不相等则不相等 在两种情况下,会导致变量原值不同

【C++杂货铺铺】AVL树

目录 🌈前言🌈  📁 概念 📁 节点的定义 📁 插入 📁 旋转 1 . 新节点插入较高左子树的左侧---左左:右单旋 2. 新节点插入较高右子树的右侧---右右:左单旋 3. 新节点插入较高左子树的右侧---左右:先左单旋再右单旋 4. 新节点插入较高右子树的左侧---右左:先右单旋再左单旋 📁 性能 📁 完整代码 📁 总结 🌈前