python装饰器--原来如此简单,Python 类装饰器

  python装饰器--原来如此简单,Python 类装饰器

  单一模式

  使用模块

  其实Python的模块是天然的singleton模式,因为模块第一次导入的时候会生成一个. pyc文件,第二次导入的时候会直接加载。pyc文件,而无需再次执行模块代码。因此,我们只需要在一个模块中定义相关的函数和数据,就可以得到一个singleton对象。如果我们真的想要一个单例类,我们可以考虑这样做:

  # mysingleton.py

  类My_Singleton(对象):

  def foo(自身):

  及格

  my_singleton=My_Singleton()

  将上面的代码保存在文件mysingleton.py中,并像这样使用它:

  从mysingleton导入my_singleton

  my_singleton.foo()

  一个

  2

  三

  从mysingleton导入my_singleton

  my_singleton.foo()

  使用__new__

  为了使一个类只有一个实例,我们可以使用new来控制实例的创建过程。代码如下:

  类单例(对象):

  _instance=无

  def __new__(cls,*args,**kw):

  如果不是cls。_实例:

  cls。_instance=super(Singleton,cls)。__new__(cls,*args,**kw)

  返回cls。_实例

  类MyClass(Singleton):

  a=1

  在上面的代码中,我们将类的实例与类变量instance关联起来。如果cls。_instance为None,我们创建实例,否则直接返回cls。_instance。

  实现如下:

  one=MyClass()

  two=MyClass()

  一=二

  真实的

  一等于二

  真实的

  id(一),id(二)

  (4303862608, 4303862608)

  使用装饰器

  我们知道,装饰器可以动态地修改类或函数的功能。在这里,我们还可以使用装饰器来装饰一个类,使它只能生成一个实例。代码如下:

  从functools导入包装

  def singleton(cls):

  实例={}

  @wraps(cls)

  def getinstance(*args,**kw):

  如果cls不在实例中:

  实例[cls]=cls(*args,**kw)

  返回实例[cls]

  返回getinstance

  @单身

  类MyClass(对象):

  a=1

  从functools导入包装

  上面,我们定义了一个decorator singleton,它返回一个内部函数getinstance,这个函数将确定一个类是否在字典实例中。如果不存在,它会将cls存储为键,将cls(*args,**kw)存储为实例中的值。否则,它将直接返回实例[cls]。

  使用元类

  元类可以控制创建类的过程,它主要做三件事:

  拦截类的创建。

  修改类的定义

  返回修改后的类。

  使用元类实现单例模式的代码如下:

  类Singleton(类型):

  _instances={}

  def __call__(cls,*args,**kwargs):

  如果cls不在cls。_实例:

  cls。_ instances[cls]=super(Singleton,cls)。__call__(*args,**kwargs)

  返回cls。_实例[cls]

  # Python2

  类MyClass(对象):

  __元类__=单例

  # Python3

  # class my class(meta class=Singleton):

  #通过

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: