__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)

  

猜你喜欢

转载自www.cnblogs.com/huangjiangyong/p/10920631.html