亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python中__new__函數(shù)的具體使用

 更新時(shí)間:2025年09月17日 08:58:38   作者:Lumiron  
new是object基類提供的內(nèi)置靜態(tài)方法,本文主要介紹了python中__new__函數(shù)的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

__new__函數(shù)的介紹

new 是object基類提供的內(nèi)置靜態(tài)方法(雖然通常不需要顯式地使用 @staticmethod 裝飾器)。

__new__函數(shù)的作用

總結(jié):它的作用是為一個(gè)類創(chuàng)建并返回一個(gè)新的實(shí)例。
1、在內(nèi)存中分配對象的空間。
2、返回對象的引用。

__new__函數(shù)的重寫

如果因?yàn)開_new__函數(shù)重寫導(dǎo)致沒有正確的返回實(shí)例化對象的引用,__init__函數(shù)將不被調(diào)用。

1、重寫代碼示例:

注意點(diǎn):
1、重寫時(shí)需要調(diào)用super,對父類做擴(kuò)展。
2、需要返回super的返回值,即實(shí)例的引用。(博主在這里認(rèn)為如果不返回實(shí)例的引用,會(huì)有內(nèi)存泄漏)

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called. Creating instance.")
        # 最關(guān)鍵的一步:調(diào)用父類的 __new__ 來創(chuàng)建實(shí)例
        instance = super().__new__(cls)
        # 這里可以對 instance 做一些非常早期的操作
        return instance # 必須返回實(shí)例!

    def __init__(self, value):
        print("__init__ is called. Initializing instance.")
        self.value = value

# 測試
obj = MyClass(42)
print(obj.value)

輸出:

__new__ is called. Creating instance.
__init__ is called. Initializing instance.
42

2、錯(cuò)誤重寫方法1:

重寫__new__方法,直接覆蓋。無法成功的實(shí)例化對象。

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called. Creating instance.")

    def __init__(self, value):
        print("__init__ is called. Initializing instance.")
        self.value = value

# 測試
obj = MyClass(42)
print(obj)

輸出

__new__ is called. Creating instance.
None

3、錯(cuò)誤重寫方法2:

調(diào)用了父類的__new__創(chuàng)建實(shí)例,但是未返回實(shí)例的引用。

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called. Creating instance.")
        # 最關(guān)鍵的一步:調(diào)用父類的 __new__ 來創(chuàng)建實(shí)例
        super().__new__(cls)

    def __init__(self, value):
        print("__init__ is called. Initializing instance.")
        self.value = value

# 測試
obj = MyClass(42)
print(obj)

輸出

__new__ is called. Creating instance.
None

4. __new__函數(shù) 的常見用途

用途 1:實(shí)現(xiàn)單例模式 (Singleton)

單例模式確保一個(gè)類只有一個(gè)實(shí)例。

class Singleton:
    _instance = None # 類變量,用于保存唯一的實(shí)例

    def __new__(cls, *args, **kwargs):
        # 如果實(shí)例還不存在,就創(chuàng)建一個(gè)
        if not cls._instance:
            cls._instance = super().__new__(cls)
        # 如果已經(jīng)存在,直接返回已有的實(shí)例
        # 注意:每次調(diào)用 Singleton(),__init__ 仍然會(huì)被重新執(zhí)行
        return cls._instance

    def __init__(self, name):
        self.name = name

# 測試
s1 = Singleton("First")
s2 = Singleton("Second")

print(s1 is s2)  # 輸出: True,它們是同一個(gè)對象
print(s1.name)    # 輸出: "Second" (注意!因?yàn)?__init__ 被第二次調(diào)用覆蓋了)

注意:上面的例子有一個(gè)“陷阱”,第二次創(chuàng)建實(shí)例時(shí),init 依然會(huì)執(zhí)行并修改了唯一實(shí)例的屬性。要避免這個(gè)問題,需要更復(fù)雜的控制。

用途 2:繼承不可變類型 (如 int, str, tuple)

不可變類型在 init 里無法被修改,因?yàn)閷ο笤?init 被調(diào)用前就已經(jīng)創(chuàng)建好了。所以必須在 new 階段就修改它們。

class PositiveInteger(int):
    def __new__(cls, value):
        # 在創(chuàng)建對象之前,先對值進(jìn)行加工
        return super().__new__(cls, abs(value))

# 測試
num = PositiveInteger(-5)
print(num)  # 輸出: 5 (是一個(gè)真正的 int 類型)
print(type(num)) # 輸出: <class '__main__.PositiveInteger'>

用途 3:返回其他類的實(shí)例(工廠模式)

new 可以決定返回什么對象,不一定是當(dāng)前類的實(shí)例。

class ClassA:
    pass

class ClassB:
    pass

class MyFactory:
    def __new__(cls, obj_type):
        if obj_type == 'A':
            return ClassA()
        elif obj_type == 'B':
            return ClassB()
        else:
            return None

# 測試
obj1 = MyFactory('A')
obj2 = MyFactory('B')

print(type(obj1)) # 輸出: <class '__main__.ClassA'>
print(type(obj2)) # 輸出: <class '__main__.ClassB'>

new與init的區(qū)別

特性newinit
作用創(chuàng)建對象,并返回這個(gè)新對象初始化已被創(chuàng)建的對象
調(diào)用順序先調(diào)用后調(diào)用
參數(shù)第一個(gè)參數(shù)是 cls (類本身)第一個(gè)參數(shù)是 self (實(shí)例本身)
返回值必須返回創(chuàng)建的對象實(shí)例(通常是 cls 的實(shí)例)不應(yīng)該返回任何值(返回 None)
本質(zhì)它是一個(gè)靜態(tài)方法它是一個(gè)實(shí)例方法

到此這篇關(guān)于python實(shí)現(xiàn)__new__函數(shù)的文章就介紹到這了,更多相關(guān)python __new__函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Python實(shí)現(xiàn)識別花卉種類的示例代碼

    Python實(shí)現(xiàn)識別花卉種類的示例代碼

    “無窮小亮的科普日常”經(jīng)常會(huì)發(fā)布一些鑒定網(wǎng)絡(luò)熱門生物視頻,既科普了生物知識,又滿足觀眾們的獵奇心理。今天我們也來用Python鑒定一下網(wǎng)絡(luò)熱門植物
    2022-04-04
  • python機(jī)器人行走步數(shù)問題的解決

    python機(jī)器人行走步數(shù)問題的解決

    這篇文章主要為大家詳細(xì)介紹了python機(jī)器人行走步數(shù)問題的解決,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 如何使用Python中的正則表達(dá)式處理html文件

    如何使用Python中的正則表達(dá)式處理html文件

    html類型的文本數(shù)據(jù)內(nèi)容是由前端代碼書寫的標(biāo)簽+文本數(shù)據(jù)的格式,可以直接在chrome瀏覽器打開,清楚的展示出文本的格式,下面這篇文章主要給大家介紹了關(guān)于如何使用Python中的正則表達(dá)式處理html文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • python爬蟲遇到403錯(cuò)誤的問題及解決

    python爬蟲遇到403錯(cuò)誤的問題及解決

    這篇文章主要介紹了python爬蟲遇到403錯(cuò)誤的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python實(shí)現(xiàn)字典嵌套列表取值

    python實(shí)現(xiàn)字典嵌套列表取值

    今天小編就為大家分享一篇python實(shí)現(xiàn)字典嵌套列表取值,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中flatten( ),matrix.A用法說明

    Python中flatten( ),matrix.A用法說明

    這篇文章主要介紹了Python中flatten( ),matrix.A用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python自動(dòng)生成代碼 使用tkinter圖形化操作并生成代碼框架

    Python自動(dòng)生成代碼 使用tkinter圖形化操作并生成代碼框架

    這篇文章主要為大家詳細(xì)介紹了Python自動(dòng)生成代碼,使用tkinter圖形化操作并生成代碼框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Python中使用__hash__和__eq__方法的問題

    Python中使用__hash__和__eq__方法的問題

    這篇文章主要介紹了Python中使用__hash__和__eq__方法的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 如何在mac版pycharm選擇python版本

    如何在mac版pycharm選擇python版本

    這篇文章主要介紹了如何在mac版pycharm選擇python版本,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼

    使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼

    這篇文章主要介紹了使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論