1. 程式人生 > 程式設計 >python不同版本的_new_不同點總結

python不同版本的_new_不同點總結

我們都知道python的版本不同,在使用的時候就有所區別。鑑於我們推薦小夥伴們選擇python3版本,所以這方面的區別瞭解的不是很多。就拿_new_來說,在python2和3中的寫法是不一樣的,之前有接觸_new_的小夥伴想必沒有注意到這個問題。接下來講講new的基本用法,然後就python不同版本中_new_的區別帶來詳解。

new方法接受的引數雖然也是和init一樣,但init是在類例項建立之後呼叫,而 new方法正是建立這個類例項的方法。

class Person(object):
  """Silly Person"""
  def __new__(cls,name,age):
    print '__new__ called.'
    return super(Person,cls).__new__(cls,age)
  def __init__(self,age):
    print '__init__ called.'
    self.name = name
    self.age = age
  def __str__(self):
    return '<Person: %s(%s)>' % (self.name,self.age)
if __name__ == '__main__':
  piglei = Person('piglei',24)
print piglei

Python3和 Python2中__new__使用不同

Python3的寫法

class Singleton(object):
  def __new__(cls,*args,**kwargs):
    if not hasattr(cls,'_inst'):
      print(cls)
      cls._inst = super(Singleton,cls).__new__(cls)
    return cls._inst

如果Python3的寫法跟Python2寫法一樣,那麼倒數第二行會報錯

"TypeError: object() takes no parameters"

根據上面的執行結果我們可以發現,在python3中強行使用python2的寫法是不可行的。

Python __new__()知識點擴充

__new__() 是一種負責建立類例項的靜態方法,它無需使用 staticmethod 裝飾器修飾,且該方法會優先 __init__() 初始化方法被呼叫。

一般情況下,覆寫 __new__() 的實現將會使用合適的引數呼叫其超類的 super().__new__(),並在返回之前修改例項。例如:

class demoClass:
  instances_created = 0
  def __new__(cls,**kwargs):
    print("__new__():",cls,args,kwargs)
    instance = super().__new__(cls)
    instance.number = cls.instances_created
    cls.instances_created += 1
    return instance
  def __init__(self,attribute):
    print("__init__():",self,attribute)
    self.attribute = attribute
test1 = demoClass("abc")
test2 = demoClass("xyz")
print(test1.number,test1.instances_created)
print(test2.number,test2.instances_created)

輸出結果為

__new__(): <class '__main__.demoClass'> ('abc',) {}
__init__(): <__main__.demoClass object at 0x0000026FC0DF8080> abc
__new__(): <class '__main__.demoClass'> ('xyz',) {}
__init__(): <__main__.demoClass object at 0x0000026FC0DED358> xyz
0 2
1 2

到此這篇關於python不同版本的_new_不同點總結的文章就介紹到這了,更多相關python不同版本中的_new_有何不同內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!