python不同版本中的_new_有什么区别

  

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_有什么区别