python不同版本中的_new_有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
新方法接受的参数虽然也是和init一样,但初始化是在类实例创建之后调用,而新的方法正是创建这个类实例的方法。
类人(对象): “““傻Person"”;“ def __new__ (cls、名字、年龄): 打印& # 39;__new__叫强生# 39; 返回超级(人,cls)。__new__ (cls、名字、年龄) def __init__(自我、名字、年龄): 打印& # 39;__init__叫强生# 39; self.name=名字 自我。年龄=年龄 def __str__(自我): 返回& # 39;& lt;人:% s (% s)祝辞& # 39;% (self.name self.age) if __name__==& # 39; __main__ # 39;: piglei=人(& # 39;piglei& # 39;, 24) 打印piglei
Python3和Python2中__new__使用不同
<强> Python3的写法强>
单例类(对象): def __new__ (cls * args, * * kwargs): 如果不是hasattr (cls & # 39; _inst& # 39;): 打印(cls) cls。_inst=超级(Singleton, cls) . __new__ (cls) 返回cls。_inst
如果Python3的写法跟Python2写法一样,那么倒数第二行会报错
“TypeError:对象()不接受parameters"
根据上面的运行结果我们可以发现,在Python3中强行使用Python2的写法是不可行的。
__new__()是一种负责创建类实例的静态方法,它无需使用staticmethod装饰器修饰,且该方法会优先__init__()初始化方法被调用。
一般情况下,覆写__new__()的实现将会使用合适的参数调用其超类的超级(). __new__(),并在返回之前修改实例例。如:
类demoClass: instances_created=0 def __new__ (cls * args, * * kwargs): print (“__new__ ():“, cls, args, kwargs) 实例=super () . __new__ (cls) 实例。数量=cls.instances_created cls。instances_created +=1 返回实例 def __init__(自我、属性): print (“__init__():“,自我,属性) 自我。属性=属性 test1=demoClass (“abc") test2=demoClass (“xyz") 打印(test1.number test1.instances_created) 打印(test2.number test2.instances_created)
输出结果为
__new__ (): & lt;类& # 39;__main__.demoClass& # 39;比;(& # 39;abc # 39;) {}
引用>
__init__ (): & lt;在0 x0000026fc0df8080> __main__.demoClass对象;abc
__new__ (): & lt;类& # 39;__main__.demoClass& # 39;比;(& # 39;xyz # 39;) {}
__init__ (): & lt;在0 x0000026fc0ded358> __main__.demoClass对象;xyz
0 2
1 2关于python不同版本中的_new_有什么区别问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
python不同版本中的_new_有什么区别