提前创建__new__魔术方法

__New__#

'''
	触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
	功能:控制对象的创建过程
	参数:至少一个cls接受当前的类,其他根据情况决定
	返回值:通常返回对象或None
'''

基本使用#

class MyClass2():
	a = 100
obj2 = MyClass2()
# print(obj2)

class MyClass1():
	def __new__(cls):
		print(cls)	# 是Myclass1 本身	
		# 1.返回本类对象
		"""类.成员方法(类)"""
		return object.__new__(cls)
		# 2.返回其他类的对象
		return obj2
		# 3.不返回对象,None
		return None		
	
obj = MyClass1()
# print(obj.a) 	# 2.返回其他类的对象
print(obj)

new 触发时机要快于 init#

"""
__new__  创建对象
__init__ 初始化对象
"""
class MyClass():

	def __new__(cls):
		print(1)
		return object.__new__(cls)

	def __init__(self):
		print(2)
	
obj = MyClass()	

# out 先 1  后 2

__new__的参数要和__init__参数一一对应#

"""
例如 obj = MyClass())
Python 首先调用 MyClass.__new__() 方法来创建一个新的实例对象,因为本身你创建时候会有对象 所以必须参数一致,然后再调用 MyClass.__init__() 方法来初始化这个实例对象。
"""

class Boat():
	def __new__(cls,name):
		return object.__new__(cls)
	
	def __init__(self,name):
		self.name  = name

obj = Boat("万里阳光号")
print(obj.name)



# *args,**kwargs 可以收集多余的所有参数
class Boat():
	# *args,**kwargs 可以收集多余的所有参数
	def __new__(cls,*args,**kwargs):
		return object.__new__(cls)
	
	def __init__(self,name,type):
		self.name  = name
		self.type = type

obj = Boat("万里阳光号","破木头做的")
print(obj.name , obj.type)

__new__和__init__之间的注意点#

"""
如果__new__ 没有返回对象或者返回的是其他类的对象,不会调用构造方法.
只有在返回自己本类对象的时候,才会调用构造方法.
"""
class Children():
	def __new__(cls,*args,**kwargs):
		return obj2
		# pass
		
	def __init__(self,name,skin):
		print("构造方法被触发 ... ")
		# self.name = name
		# self.skin = skin
		
obj = Children("灭霸","紫薯")

# print(obj.name) error
# print(obj.skin) error
posted @   江寒雨  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
主题色彩