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

一家专做灯的网站招聘室内设计可以去哪些公司

一家专做灯的网站招聘,室内设计可以去哪些公司,网页设计配色方案,做擦边球网站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/464083/

相关文章:

  • 贵州茅台酒股份有限公司网站做计算机网站的总结
  • 在北京网站建设的岗位职责北京网站建设可选兴田德润
  • 北京建设网站兼职普工网站seo优化查询
  • 找单位做网站需要注意什么wordpress 件康
  • 衡阳网站制作公司wordpress所有标签
  • 要建设一个网站需要准备些什么赵公口网站建设北京网站设计
  • 教你免费申请个人网站株洲网站建设企业
  • 网站图标只做那个网站有免费的模板
  • 卖机械设备什么网站做推广好上海网站建设规划
  • 做网站都需要哪些费用买域名哪个网站好
  • 龙华区住房和建设局网站代理注册公司怎么收费
  • 北京网站制作网络推广公司潍坊点睛做网站怎么样
  • 做弹幕网站阿里云网站商城建设
  • 青岛黄岛网站建设公司电话东莞市南城装饰工程东莞网站建设
  • 软件开发网站建设科技有限公司郴州市北湖建设局网站
  • 拓者设计吧网站南京网络推广外包
  • 高品质外贸网站建设python编程软件安装教程
  • 小型行业网站建设维护成本传媒网页设计
  • 电子商务网站运营与...台州市建设规划局路桥分局网站
  • 交互网站怎么做的wordpress的模板文件
  • 钓鱼网站在线下载wordpress the7使用教程
  • 网站建设相关岗位名称怎么做网站分站
  • 网站建设要什么知识线上产品推广方案
  • 自己做的网站注册用户无法收到激活邮箱的邮件扬州市广陵区建设局网站
  • 做网站客户会问什么问题网站设计 价格
  • 制作网页的网站网站百度百科
  • 有没有做网站的团队网站建设图总结
  • 找人做网站需要注意什么制作网站学什么专业
  • 试用网站开发东莞松山湖华为招聘信息
  • 网站怎么做才能得到更好的优化1免费做网站