• Python中__new__的作用


    __new__ 的作用

    依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。

    首先我们来看一下第一个功能,具体我们可以用int来作为一个例子:

    假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。

    class PositiveInteger(int):
    
      def __init__(self, value):
    
        super(PositiveInteger, self).__init__(self, abs(value))
    
    i = PositiveInteger(-3)
    
    print i

    但运行后会发现,结果根本不是我们想的那样,我们仍然得到了-3。这是因为对于int这种不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。

    这是修改后的代码:

    class PositiveInteger(int):
    
      def __new__(cls, value):
    
        return super(PositiveInteger, cls).__new__(cls, abs(value))
    
    i = PositiveInteger(-3)
    
    print i

    通过重载__new__方法,我们实现了需要的功能。

    另外一个作用,关于自定义metaclass。其实我最早接触__new__的时候,就是因为需要自定义 metaclass,但鉴于篇幅原因,我们下次再来讲python中的metaclass和__new__的关系。

    用__new__来实现单例

    事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。

    因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式。

    class Singleton(object):
    
      def __new__(cls):
    
        # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
    
        if not hasattr(cls, 'instance'):
    
          cls.instance = super(Singleton, cls).__new__(cls)
    
        return cls.instance
    
    obj1 = Singleton()
    
    obj2 = Singleton()
    
    obj1.attr1 = 'value1'
    
    print obj1.attr1, obj2.attr1
    
    print obj1 is obj2

    输出结果:

    value1 value1

    True

    可以看到obj1和obj2是同一个实例。

  • 相关阅读:
    Server Apache Tomcat v7.0 at localhost failed to start.
    iOS-UITextField、一些知识点
    iOS-UIButton
    iOS-URL
    iOS-UITableView(三)
    iOS-MVC(转)
    iOS-UITableView(二)
    iOS-UITableView(一)
    iOS-UIScrollView以及代理
    iOS-UIView常见方法、xib的基本使用
  • 原文地址:https://www.cnblogs.com/34fj/p/6358702.html
Copyright © 2020-2023  润新知