__new__方法以及TypeError: object() takes no parameters的處理

一些python書或博客將類中的__init__方法稱爲構造函數,而實際上這種說法是不嚴格的,由於建立實例的方法是__new__,實例初始化的方法是__init__。__new__方法會返回一個實例,而__init__返回None。python

在瞭解__init__與__new__的區別時,查到了篇文章:詳解Python中的__init__和__new__,有這段代碼:函數

# -*- coding: utf-8 -*-
class Person(object):
    """Silly Person"""
 
    def __new__(cls, name, age):
        print ('__new__ called.')
        return super().__new__(cls, name, age)  # >>>>有問題的一行<<<<
 
    def __init__(self, name, 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)

運行後發現提示錯誤:TypeError: object() takes no parametersspa

顯然基類object不接受參數,所以須要將有問題的那行改成:code

return super().__new__(cls)blog

實際上,上面的例子是不必使用__new__方法的,僅僅是爲了展現方法的調用順序。__new__方法在繼承一些不可變的類(好比int, str, tuple)時會用到,好比建立一個永遠保留兩位小數的float類型,則能夠這樣寫:繼承

# -*- coding: utf-8 -*-
class RoundFloat(float):
    def __new__(cls, value):
        return super().__new__(cls, round(value, 2))   
 
print(RoundFloat(3.14159))  #3.14
相關文章
相關標籤/搜索