最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中__new__函數的具體使用

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

__new__函數的介紹

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

__new__函數的作用

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

__new__函數的重寫

如果因為__new__函數重寫導致沒有正確的返回實例化對象的引用,__init__函數將不被調用。

1、重寫代碼示例:

注意點:
1、重寫時需要調用super,對父類做擴展。
2、需要返回super的返回值,即實例的引用。(博主在這里認為如果不返回實例的引用,會有內存泄漏)

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

    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、錯誤重寫方法1:

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

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、錯誤重寫方法2:

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

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called. Creating instance.")
        # 最關鍵的一步:調用父類的 __new__ 來創(chuàng)建實例
        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__函數 的常見用途

用途 1:實現單例模式 (Singleton)

單例模式確保一個類只有一個實例。

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

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

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

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

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

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

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

不可變類型在 init 里無法被修改,因為對象在 init 被調用前就已經創(chuàng)建好了。所以必須在 new 階段就修改它們。

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

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

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

new 可以決定返回什么對象,不一定是當前類的實例。

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)建對象,并返回這個新對象初始化已被創(chuàng)建的對象
調用順序先調用后調用
參數第一個參數是 cls (類本身)第一個參數是 self (實例本身)
返回值必須返回創(chuàng)建的對象實例(通常是 cls 的實例)不應該返回任何值(返回 None)
本質它是一個靜態(tài)方法它是一個實例方法

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

相關文章

  • Python 圖片轉數組,二進制互轉操作

    Python 圖片轉數組,二進制互轉操作

    這篇文章主要介紹了Python 圖片轉數組,二進制互轉操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python利用多線程優(yōu)化for循環(huán)的技巧分享

    Python利用多線程優(yōu)化for循環(huán)的技巧分享

    多線程可以讓程序同時執(zhí)行多個任務,從而提高整體運行效率,這篇文章將詳細介紹如何在Python中使用多線程來優(yōu)化for循環(huán),感興趣的可以了解下
    2025-02-02
  • Python基礎之進程詳解

    Python基礎之進程詳解

    今天帶大家學習Python基礎知識,文中對python進程作了詳細的介紹,對正在學習python基礎的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • python之文件讀取一行一行的方法

    python之文件讀取一行一行的方法

    今天小編就為大家分享一篇python之文件讀取一行一行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 關于fastapi異步框架操作的理解

    關于fastapi異步框架操作的理解

    這篇文章主要介紹了關于fastapi異步框架的操作,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Django中select_related查詢優(yōu)化的具體實現

    Django中select_related查詢優(yōu)化的具體實現

    本文介紹了Django ORM中的N+1查詢問題及其解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • python實現最小二乘法的方法詳解

    python實現最小二乘法的方法詳解

    這篇文章主要介紹了如何基于python實現最小二乘法的方法,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2024-02-02
  • Python如何在終端彩色打印輸出

    Python如何在終端彩色打印輸出

    大家好,本篇文章主要講的是Python如何在終端彩色打印輸出,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Python格式化輸出%s和%d

    Python格式化輸出%s和%d

    本篇文章主要介紹了Python格式化輸出%s和%d的實例案例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Python算法輸出1-9數組形成的結果為100的所有運算式

    Python算法輸出1-9數組形成的結果為100的所有運算式

    這篇文章主要介紹了Python算法輸出1-9數組形成的結果為100的所有運算式,然后介紹了另外一個相關實例,具體內容請參閱正文,需要的朋友可以參考下。
    2017-11-11

最新評論

九龙城区| 收藏| 河北省| 丹江口市| 汕头市| 左权县| 石河子市| 隆林| 榆中县| 亚东县| 万山特区| 叙永县| 沅陵县| 宣城市| 阿巴嘎旗| 佛坪县| 罗甸县| 桃源县| 芮城县| 兴义市| 肥城市| 临安市| 斗六市| 新密市| 涞源县| 临澧县| 贡山| 奉新县| 定陶县| 甘泉县| 潜江市| 南涧| 临澧县| 格尔木市| 红安县| 新营市| 密山市| 西林县| 涿州市| 奉化市| 鱼台县|