当前位置: 首页 > news >正文

重庆网站wordpress4.6 nodejs

重庆网站,wordpress4.6 nodejs,品牌推广百度seo,wordpress企业主题源码Django信号的实现原理本质是设计模式中的观察者模式,浅谈Python设计模式 -- 观察者模式,也可以叫做发布-订阅模式,信号对象维护一个订阅者列表,当信号被触发时,它会遍历订阅者,依次通知它们。 先来回顾一下…

Django信号的实现原理本质是设计模式中的观察者模式,浅谈Python设计模式 -- 观察者模式,也可以叫做发布-订阅模式,信号对象维护一个订阅者列表,当信号被触发时,它会遍历订阅者,依次通知它们。

先来回顾一下信号的定义和使用:

from django.dispatch import receiver, Signal# 信号定义
node_approved = Signal()# 信号的注册
@receiver(node_approved)
def on_node_approved(sender, instance, **kwargs):print(‘接收到信号’)# 信号的触发
node_approved.send(sender=xx, instance=yy)

源码分析:

1、先来看receiver这个装饰器:

def receiver(signal, **kwargs):"""A decorator for connecting receivers to signals. Used by passing in thesignal (or list of signals) and keyword arguments to connect::@receiver(post_save, sender=MyModel)def signal_receiver(sender, **kwargs):...@receiver([post_save, post_delete], sender=MyModel)def signals_receiver(sender, **kwargs):..."""def _decorator(func):if isinstance(signal, (list, tuple)):for s in signal:s.connect(func, **kwargs)else:signal.connect(func, **kwargs)return funcreturn _decorator

逻辑很简单的一个装饰器,核心是调用Signal信号对象的connect方法,也就是上面举例中的node_approved这个对象的connect方法。

2、接着看Signal 的connect方法:

class Signal:def __init__(self, providing_args=None, use_caching=False):"""Create a new signal."""self.receivers = []...def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):from django.conf import settings# If DEBUG is on, check that we got a good receiverif settings.configured and settings.DEBUG:assert callable(receiver), "Signal receivers must be callable."# Check for **kwargsif not func_accepts_kwargs(receiver):raise ValueError("Signal receivers must accept keyword arguments (**kwargs).")if dispatch_uid:lookup_key = (dispatch_uid, _make_id(sender))else:lookup_key = (_make_id(receiver), _make_id(sender))if weak:ref = weakref.refreceiver_object = receiver# Check for bound methodsif hasattr(receiver, '__self__') and hasattr(receiver, '__func__'):ref = weakref.WeakMethodreceiver_object = receiver.__self__receiver = ref(receiver)weakref.finalize(receiver_object, self._remove_receiver)with self.lock:self._clear_dead_receivers()if not any(r_key == lookup_key for r_key, _ in self.receivers):self.receivers.append((lookup_key, receiver))self.sender_receivers_cache.clear()

只看倒数第二行:self.receivers.append((lookup_key, receiver)),如果你了解观察者模式就很好理解这行代码的意图:将被装饰的信号处理函数(on_node_approved)注册到self.recervers属性中,也就是观察者模式中讲的主题维护观察者列表行为。

一旦有了这个观察者列表,那么就很容易做到信号被触发时,通知每个观察者的目的。下面看看源码是怎么实现的:

3、信号触发send源码:

class Signal:def __init__(self, providing_args=None, use_caching=False):"""Create a new signal."""self.receivers = []...def _live_receivers(self, sender):"""Filter sequence of receivers to get resolved, live receivers.This checks for weak references and resolves them, then returning onlylive receivers."""...receivers = None...for (receiverkey, r_senderkey), receiver in self.receivers:if r_senderkey == NONE_ID or r_senderkey == senderkey:receivers.append(receiver)...non_weak_receivers = []for receiver in receivers:if isinstance(receiver, weakref.ReferenceType):# Dereference the weak reference.receiver = receiver()if receiver is not None:non_weak_receivers.append(receiver)else:non_weak_receivers.append(receiver)return non_weak_receiversdef send(self, sender, **named):if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:return []return [(receiver, receiver(signal=self, sender=sender, **named))for receiver in self._live_receivers(sender)]

send理解起来也不难:遍历self._live_receivers(),依次调用各个receiver。而_live_receivers通过源码也可以看出本质还是遍历前面提到的观察者列表self.recervers属性。

http://www.yayakq.cn/news/364911/

相关文章:

  • 美食网站的建设背景网站建设对用户影响
  • 计算机网站维护建设wordpress html模式
  • 沃然建站平台官网哈尔滨seo网站排名
  • 无极网站登录网站定制
  • 网站中的关键词seo设置创建网站需要哪些过程
  • 建设银行网站怎么查自己账号做网站要不要钱
  • 深圳企业网站建设收费标准福田网站设计哪家好
  • 专业做网站哪家便宜中国佛山手机网站建设
  • 网站维护服务费公司名字logo免费设计
  • 下一页word网站sem优化怎么做
  • 做网站注册有哪些工装设计网站案例
  • 中国最大网站建设商推荐知乎网站打不开 其它能打开
  • 网站集群建设wordpress主题百度网盘
  • 网站做301根目录在哪里wordpress七牛云缓存插件
  • 南京旅游网站建设公司wordpress 清空修订版本
  • 除了阿里巴巴还有什么网站做外贸的开发必备软件
  • 常州网站建设网站房产中介网站建设技巧
  • wordpress网站换字体颜色wordpress调用新版媒体库
  • 虐做视频网站使用vue做商城网站项目难点
  • 怎么建立一个网站放图片wordpress 下雪插件
  • 重庆网站建设与推广公众号开放平台
  • 教育系统网站cms设计介绍人的网站
  • 宽屏大气企业网站源码网站推广怎么样做
  • 网站推广商品怎么做效果最好园林景观设计公司需要什么资质
  • 合格的网站设计师需要会什么软件建设医院网站的目的
  • 网站开发的网站网站的兼容性
  • 自己做淘宝返利网站吗网页制作图片
  • 南通电商网站建设网络营销成功案例分析
  • 物流网站的建设论文互联网信息服务
  • 返利网站怎么做wordpress首页怎么改