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就一样了

  • 相关阅读:
    【C++缺省函数】 空类默认产生的6个类成员函数
    iOS 关于 UIKit 专栏应该写在最前面的话
    openssl之EVP系列之8---EVP_Digest系列函数具体解释
    二进制中1的个数
    UVA 548(二叉树重建与遍历)
    Leetcode Best Time to Buy and Sell Stock III
    javascript new Date()函数在不同浏览器上返回不同的值
    【网络流】 HDU 3468 Treasure Hunting
    树莓派玩耍笔记1 -- 开箱 & 安装系统以及简单配置
    POJ 1195 Mobile phones (二维树状数组)
  • 原文地址:https://www.cnblogs.com/yan-peng/p/9965628.html
Copyright © 2011-2022 走看看