Python学习之__new__方法
#!/usr/bin/env python #-*-coding:utf8-*- # ### __new__ 魔术方法 """ 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接收当前的类,其他根据情况决定 返回值:通常返回对象或None """ class MyClass2(): b=2 obj2 = MyClass2() # (1) 基本语法 """ 借助父类object里面的__new__方法创建对象 需要传递cls这个参数,代表的是本类,为本类创建对象,进行返回 """ class MyClass(): a=1 def __new__(cls): print(cls) #<class '__main__.MyClass'> #借助父类object里面的__new__方法创建对象 #返回本对象 return object.__new__(cls) #返回其他类的对象 # return obj2 #不返回任何对象 # return None obj=MyClass() # print(obj) #返回本对象 # print(obj.a) # 返回其他类的对象 # print(obj.b) """ __new__(创建对象)触发时机快于__init__(初始化对象) """ # 传一个参数 class MyClass(): def __new__(cls,name): return object.__new__(cls) def __init__(self,name): self.name = name obj=MyClass("滴滴") # 传多个参数 class MyClass(): def __new__(cls,*args,**kwargs): return object.__new__(cls) def __init__(self,name,skin,age): self.name = name self.skin=skin self.age=age obj=MyClass("滴滴","green",18) print(obj.name) # 注意点 """ 如果__new__返回的不是自己本类的对象,不会触发构造方法__init__ """ class MyClass(): def __new__(cls,*args,**kwargs): print("new方法被触发") # return object.__new__(cls) return obj2 def __init__(self): print("init方法被触发") obj=MyClass() # print(obj.name)
#!/usr/bin/env python #-*-coding:utf8-*- # ### 单态模式:无论实例化对象多少次,都有且只有一个对象 # (1) 基本语法 """为了节省空间,加快效率,提出单态模式""" class Singleton(): __obj = None #实例化几次都会创建对应的对象,不写这句的话 def __new__(cls): if cls.__obj is None: #类.属性调用 cls.__obj = object.__new__(cls) #创建对象 # print(cls) #<class '__main__.Singleton'> return cls.__obj """ 第一次实例化的时候,cls.__obj is None返回真, 执行cls.__obj = object.__new__(cls) 返回对象 让cls.__obj接收对象 第二次实例化的时候,cls.__obj is None返回False, return cls.__obj 内存中堆空间存放的值返回 以后 每次进行实例化的对象,都是第一次存储的那个对象 就实现了无论实例化几次,都返回同一个对象 """ obj1=Singleton() obj2=Singleton() print(obj1 is obj2) # (1) 单态模式 + 构造方法 class Singleton(): __obj = None #实例化几次都会创建对应的对象,不写这句的话 def __new__(cls,*args,**kwargs): if cls.__obj is None: #类.属性调用 cls.__obj = object.__new__(cls) #创建对象 return cls.__obj def __init__(self,name): self.name=name obj1=Singleton("李剑诗") obj2=Singleton("别小楼") print(obj1.name) print(obj2.name,obj1.name is obj2.name) """ 第一次实例化的时候,self.name = 李剑诗, 第二次实例化的时候,返回的是第一次实例化出来对象 将该对象以前的name属性 从 李剑诗 改成 别小楼 self.name = 别小楼 """