zoukankan      html  css  js  c++  java
  • [Python]python面向对象 __new__方法及单例设计

    __new__ 方法

    • 使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间
    • __new__ 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:
      • 1) 在内存中为对象 分配空间
      • 2) 返回 对象的引用
    • Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 __init__ 方法

    _new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__() 方法,因为__new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。

    如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而__new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。(摘自http://www.cnblogs.com/ifantastic/p/3175735.html)

    类的实例化:

    class MyHome(object):
        def __init__(self, *args, **kwargs):
            pass
    
    # 实例化
    my_home = MyHome(*args, **kwargs)

    创建类对象时会自动调用__new__方法,如果__new__方法重写则需调用其父类,切记返回引用,return super().__new__(cls),否则__init__方法不能获得内存即不能够初始化

    __new__ 方法在单例设计模式中的应用

    单例----让类创建的对象在系统中只有唯一的一个实例,从如下的代码中可以看到,定义一个instance为None的类属性,用于记录单例对象的引用。在__new__方法重写中首先判断类属性是否为空对象None,如果is None 为True,则调用父类的方法:

    cls.instance = super().__new__(cls)
    否则,返回类属性保存的对象引用
    return cls.instance
    class MusicPlayer(object):
        # 定义类属性
        instance = None
        
        # __new__方法重写
        def __new__(cls, *args, **kwargs):
            # 1.判断类属性是否是空对象
            if cls.instance is None:
                # 2.调用父类的方法,为第一个对象分配空间
                cls.instance = super().__new__(cls)
            # 3.返回类属性保存的对象引用
            return cls.instance
    
    player1 = MusicPlayer()
    print(player1)
    
    player2 = MusicPlayer()
    print(player2)

    结果:

    <__main__.MusicPlayer object at 0x000002298A38F128>
    <__main__.MusicPlayer object at 0x000002298A38F128>

    可以看到,此时player1与player2的对象内存地址一致。

  • 相关阅读:
    python切片操作
    python中的内存管理
    python中x,y交换值的问题
    leetcode6:Zigzag Conversion@Python
    Leetcode4:Median of Two Sorted Arrays@Python
    Leetcode3:Longest Substring Without Repeating Characters@Python
    Leetcode2:Add Two Numbers@Python
    LeetCode344:Reverse String@Python
    支付宝 芝麻信用分过600,你不知道的八个特权
    穷爸爸富爸爸里面说的“现金流游戏”靠谱吗?
  • 原文地址:https://www.cnblogs.com/skyell/p/9124660.html
Copyright © 2011-2022 走看看