zoukankan      html  css  js  c++  java
  • python学习笔记

    1.loop

    2.单例模式

    3.__new__ 和单例模式

      实际应用过程中,我们可以这么使用:

     1 class LxmlDocument(object_ref):
     2   cache = weakref.WeakKeyDictionary()
     3   __slots__ = ['__weakref__']
     4  
     5   def __new__(cls, response, parser=etree.HTMLParser):
     6     cache = cls.cache.setdefault(response, {})
     7     if parser not in cache:
     8       obj = object_ref.__new__(cls)
     9       cache[parser] = _factory(response, parser)
    10     return cache[parser]
    11       

    该类中的__new__()方法的使用,就是再进行初始化之前,检查缓存中是否存在该对象,如果存在则将缓存存放对象直接返回,如果不存在,则将对象放至缓存中,供下次使用。 

    再来个单例的,通过重载__new__实现单例:

    1 class Singleton(object):
    2     def __new__(cls, *args, **kwargs):
    3         if not hasattr(cls, '_instance'):
    4             cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
    5         return cls._instanc

    __new__、__init__、__call__三个特殊方法 比较

    __new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)

      __new__方法在类定义中不是必须写的,如果没定义,默认会调用object.__new__去创建一个对象。如果定义了,就是override,可以custom创建对象的行为。
      聪明的读者可能想到,既然__new__可以custom对象的创建,那我在这里做一下手脚,每次创建对象都返回同一个,那不就是单例模式了吗?没错,就是这样
      定义单例模式时,因为自定义的__new__重载了父类的__new__,所以要自己显式调用父类的__new__,即object.__new__(cls, *args, **kwargs),或者用super(),不然就不是extend原来的实例了,而是替换原来的实例

    __init__ : 对象的初始化, 是一个实例方法,第一个参数是self。
    __call__ : 对象可call,注意不是类,是对象。

    先有创建,才有初始化。即先__new__,而后__init__

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/dingyutao/p/9031243.html
Copyright © 2011-2022 走看看