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