zoukankan      html  css  js  c++  java
  • python3面向对象(4)之__new__方法和__init__方法

    1.简单来说__new__方法和__init__方法都是类中的内置方法;这两个方法再实例化对象的时候会被自动调用;

    2.__new__方法的调用在 __init__方法之前;

    3.__new__方法中有个参数:cls   ;  __init__方法中有个参数是self  

    4.__new__方法的作用是:(1)为实例化对象分配一个空间(2)返回这个对象的引用

    5.__init__方法的作用是对这个实例化对象再次加工;self指的就是这个实例化对象

    看代码:

    class MusicPlayer(object):    #创建一个音乐播放器
    
        def __new__(cls, *args, **kwargs):
    
            print("创建对象,分配空间")    # 1. 创建对象时,new方法会被自动调     
            instance = super().__new__(cls)   # 2. 为对象分配空间
            return instance   # 3. 返回对象的引用,必须的有这个返回,不然self找不到对象
    
        def __init__(self,name):   #初始化方法;对这个实例化对象再次加工
         self.name = name print("播放器初始化") # 创建播放器对象 player = MusicPlayer("小米") print(player)

     做个不是很恰当的比喻(暂时想到的这个);类就好比一张大楼的图纸;我们要按着这个图纸去建大楼;而__new__方法就好比建造这个大楼的地址,你是要在北京盖楼还是上海盖楼,必须有个明确的地址,而__init__方法就好比;有了图纸和地方就开始建楼吧。

    二通过__new__方法实现单例模式

    首先要明白什么是单例模式:简单理解就是一个类只能创建一个实例对象(还用上面这个比喻,就是说我们这个开发商比较小,只能拿到一块地皮;当我们第一次用这块地盖了楼,又想盖第二栋没有地皮怎么办啊,简单把把上次盖好的拆掉就又有地方了啊)

    看代码:

    class MusicPlayer(object):
    
        def __new__(cls, *args, **kwargs):
    
            # 1. 创建对象时,new方法会被自动调用
            print("创建对象,分配空间")
    
            # 2. 为对象分配空间
            instance = super().__new__(cls)
    
            # 3. 返回对象的引用
            return instance
    
        def __init__(self):
            print("播放器初始化")
    
    
    # 创建播放器对象
    player1 = MusicPlayer()
    player2 = MusicPlayer()
    
    print(id(player1))
    print(id(player2))
    

     打印结果:这是一个正常的实例化对象;创建了两个对象;这两个对象的ID是不一样的

    创建对象,分配空间
    播放器初始化
    创建对象,分配空间
    播放器初始化
    2525789450312
    2525789421464
    

     单例模式:

    class MusicPlayer(object):
        instance = None      #定义一个类属性为None
        def __new__(cls, *args, **kwargs):
    
            # 1. 创建对象时,new方法会被自动调用
            print("创建对象,分配空间")
            if cls.instance is None:  #如果这个类属性为None就为这个对象分配一个空间
                # 2. 为对象分配空间
                cls.instance = super().__new__(cls)
    
            # 3. 返回对象的引用
            return cls.instance  #否则返回上一个对象空间
    
        def __init__(self):
            print("播放器初始化")
    
    
    # 创建播放器对象
    player1 = MusicPlayer()
    player2 = MusicPlayer()
    
    print(id(player1))
    print(id(player2))
    

     结果:

    创建对象,分配空间
    播放器初始化
    创建对象,分配空间
    播放器初始化
    2300636655688
    2300636655688
    

     那么创建的两个实例化对象的id就一样了

  • 相关阅读:
    ActiveMQ 即时通讯服务 浅析
    Asp.net Mvc (Filter及其执行顺序)
    ActiveMQ基本介绍
    ActiveMQ持久化消息的三种方式
    Windows Azure Virtual Machine (27) 使用psping工具,测试Azure VM网络连通性
    Azure China (10) 使用Azure China SAS Token
    Windows Azure Affinity Groups (3) 修改虚拟网络地缘组(Affinity Group)的配置
    Windows Azure Storage (22) Azure Storage如何支持多级目录
    Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM
    Azure Redis Cache (2) 创建和使用Azure Redis Cache
  • 原文地址:https://www.cnblogs.com/yan-peng/p/9965628.html
Copyright © 2011-2022 走看看