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 = 别小楼
"""

 

posted @ 2020-04-06 20:51  w_boy  阅读(200)  评论(0编辑  收藏  举报