__new__ '''魔术方法
# ### __new__ ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值:通常返回对象或None ''' # (1) 基本用法 """ python3.x 新式类 python2.x 旧式类, 新式类不需要每次都写一次object,默认继承 作用:控制创建的对象, """ class MyClass2(): abc = 1 obj2 = MyClass2() class MyClass(object): def __new__(cls): print(cls) # <class '__main__.MyClass'> # 借助object父类方法里面__new__ 来为本类创建一个对象 # return object.__new__(cls) # 返回一个本类对象 # return None # 返回一个空对象 # return obj2 # 返回的是一个其他类的对象 pass # 实例化对象obj # obj = MyClass() # print(obj) # print(obj.abc) # (2) 对比__new__ 和 __init__ 的触发时机 ''' __new__ 魔术方法是用来创建对象的 __init__魔术方法是用来初始化对象的 得现有对象,才能够初始化,没有对象初始化谁? __new__ 的触发时机要快于__init__ __new__ __init__ 这两个方法的参数要一一匹配. ''' #(1) 一个参数 class Boat(): def __new__(cls,name): print(1) return object.__new__(cls) def __init__(self,name): self.name = name obj = Boat("大锤") # (2) 无限个参数 class Boat(): def __new__(cls,*args,**kwargs): print(1) return object.__new__(cls) def __init__(self,*args,**kwargs): strvar = "" for i in args: strvar += i + " " print("小船的贡献者有:",strvar) print("小船的名字是{}".format(kwargs['name'])) obj = Boat("王俊文","舒畅","境泽年","五金玲",name="Anglelababy") # (3) 如果通过__new__返回的是其他类的对象,不会触发自己本类的__init__ '''因为__init__初始化的是本类对象''' class Boat(): def __new__(cls,*args,**kwargs): return obj2 def __init__(self): print("init调用了") obj = Boat() print(obj.abc)