程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python魔法方法(1):__new __(cls[,*args]) 方法

編輯:Python

Python 的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,它們是面向對象的 Python 的一切。它們是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了某一個魔法方法,那麼這個方法就會在特殊的情況下自動被 Python 所調用。

基本魔法方法——__new __

功能

創建一個對象(由 object 提供,一般不需要重寫),是對象實例化時第一個調用的方法。Python 中的 __new__() 方法是在新式類中新出現的方法,Python 中的構造方法 __init__() 負責將類實例化,而在 __init__() 執行之前,__new__() 負責制造這樣的一個實例對象,以便 __init__() 去讓該實例對象更加的豐富(為其添加屬性等)。

參數

第一個參數 cls 錶示包含該方法的類,它是自動傳參;參數 more 是一個不定長參數,可有可無。

返回值

一個對象(一般是該類的實例對象)。

應用場景

主要用於繼承一個不可變的類型,比如 str 等

使用示例

class MyText(str):
def __new__(cls, string):
# 該方法可以在實例化之前對對象進行更改操作
string = string.upper()
# 返回對象
return super().__new__(cls, string)
# return string
# 這種返回的話 sample 就是和字符串類型數據,同時__init__也不會被執行
def __init__(self, str1):
self.str1 = str1
sample = MyText("this is a example")
print(sample)

執行結果:

THIS IS A EXAMPLE
class Person(object):
def __new__(cls, *args, **kwargs):
print("call __new__()")
instance = super().__new__(cls)
return instance
def __init__(self):
print("call __init__()")
p = Person()

執行結果:

call __new__()
call __init__()
class Person1(object):
def __new__(cls, *args, **kwargs):
print("call Person __new__()")
instance = super().__new__(cls)
return instance
class Student(object):
def __new__(cls, *args, **kwargs):
print("call Student __new__()")
instance = object.__new__(Person1, *args, **kwargs)
return instance
stu = Student()
print("Type stu =", type(stu))

執行結果:

call Student __new__()
Type stu = <class '__main__.Person1'>

總結

Python 中的 __new__() 方法是一種負責創建類實例的靜態方法,且該方法會在 init() 初始化方法之前被調用。一般情況下,我們在覆寫 __new__() 的實現之前,都會先使用 super 調用父類的 new 方法。

Python 中的 __new__() 方法是在新式類中新出現的方法,Python 中的構造方法 __init__() 負責將類實例化,而在 __init__() 執行之前,__new__() 負責制造這樣的一個實例對象,以便 __init__() 去讓該實例對象更加的豐富(為其添加屬性等)。

同時,__new__() 方法還決定是否要使用該 __init__() 方法,因為 __new__() 可以調用其他類的構造方法或者直接返回別的對象來作為本類的實例。

實例化對象時,首先調用__new__方法為對象分配存儲空間,並返回對象的引用。解釋器獲取到對象的引用後,會將其作為第一個參數傳遞給__init__方法。若沒有返回該類的實例對象,則__init__方法就不會被調用。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved