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

Python 中 __new__的實現(xiàn)示例

 更新時間:2026年05月15日 09:02:25   作者:無風(fēng)聽海  
__new__是Python中負(fù)責(zé)分配并返回對象實例的方法,比__init__更早被調(diào)用,其主要區(qū)別在于調(diào)用時機、參數(shù)、返回值和職責(zé),本文主要介紹了Python 中 __new__的實現(xiàn)示例,感興趣的可以了解一下

__new__ 是 Python 中最底層的對象創(chuàng)建機制,它比 __init__ 更早被調(diào)用,真正負(fù)責(zé)分配并返回對象實例。理解它是掌握元類、單例、不可變類型定制等高級特性的基礎(chǔ)。

一、__new__vs__init__的本質(zhì)區(qū)別

class Foo:
    def __new__(cls, *args, **kwargs):
        print(f"[__new__] 分配內(nèi)存,cls={cls}")
        instance = super().__new__(cls)  # 創(chuàng)建實例
        return instance                  # 必須 return!

    def __init__(self, value):
        print(f"[__init__] 初始化,self={self}")
        self.value = value

obj = Foo(42)
# [__new__] 分配內(nèi)存,cls=<class 'Foo'>
# [__init__] 初始化,self=<__main__.Foo object>

關(guān)鍵區(qū)別:

__new____init__
調(diào)用時機實例創(chuàng)建之前實例創(chuàng)建之后
第一個參數(shù)cls(類本身)self(已有實例)
返回值必須返回實例必須返回 None
職責(zé)分配空間,構(gòu)造對象初始化屬性

__init__ 只有在 __new__ 返回了 cls 的實例時才會被調(diào)用。若返回其他類型,__init__ 會被跳過。

二、__new__的簽名與調(diào)用鏈

object.__new__(cls[, *args, **kwargs])

Python 內(nèi)部執(zhí)行 Foo(42) 的等價邏輯是:

# type.__call__ 的內(nèi)部行為(偽代碼)
def __call__(cls, *args, **kwargs):
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):        # 只有返回 cls 的實例才調(diào) __init__
        obj.__init__(*args, **kwargs)
    return obj

下面是完整的對象創(chuàng)建生命周期:—

三、最重要的使用場景

1. 單例模式(Singleton)

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance  # 始終返回同一個實例

a = Singleton()
b = Singleton()
print(a is b)  # True

2. 定制不可變類型

strint、tuple 等不可變類型必須在 __new__ 中完成初始化,因為一旦創(chuàng)建就無法修改:

class UpperStr(str):
    def __new__(cls, value):
        return super().__new__(cls, value.upper())
        # ?? 不能在 __init__ 里改,str 是不可變的

s = UpperStr("hello")
print(s)        # HELLO
print(type(s))  # <class '__main__.UpperStr'>

3. 工廠模式 —— 根據(jù)參數(shù)返回不同類型

class Shape:
    def __new__(cls, kind, *args):
        subclasses = {"circle": Circle, "rect": Rect}
        target_cls = subclasses.get(kind, cls)
        return super().__new__(target_cls)

class Circle(Shape): pass
class Rect(Shape):   pass

s = Shape("circle")
print(type(s))  # <class '__main__.Circle'>

4. 元類(Metaclass)中的__new__

元類的 __new__ 控制類本身的創(chuàng)建(不是實例的創(chuàng)建):

class Meta(type):
    def __new__(mcs, name, bases, namespace):
        # 在類定義時,自動把所有方法名轉(zhuǎn)大寫
        new_ns = {k.upper() if not k.startswith('_') else k: v
                  for k, v in namespace.items()}
        return super().__new__(mcs, name, bases, new_ns)

class Foo(metaclass=Meta):
    def hello(self): return "hi"

Foo().HELLO()  # "hi"  — 方法被重命名了

四、常見陷阱

陷阱1:忘記 return

class Bad:
    def __new__(cls):
        super().__new__(cls)  # 沒有 return!→ 返回 None
                              # __init__ 不會被調(diào)用,obj 是 None

陷阱2:__init__ 的參數(shù)必須與 __new__ 一致

# Python 會同時把參數(shù)傳給 __new__ 和 __init__
# 若簽名不匹配會報 TypeError

class Ok:
    def __new__(cls, x, y):      # 接受 x, y
        return super().__new__(cls)
    def __init__(self, x, y):    # 同樣接受 x, y ?
        self.x, self.y = x, y

陷阱3:super().__new__ 的參數(shù)

  • Python 3.3+ 后,object.__new__object.__init__ 中有一個接受了額外參數(shù),另一個就會忽略多余參數(shù)(寬容機制)
  • 但自定義鏈中不要依賴這一行為,始終顯式傳遞參數(shù)

五、__new__與__init_subclass__、__class_getitem__的關(guān)系

鉤子觸發(fā)時機典型用途
__new__每次實例化時控制實例創(chuàng)建
__init_subclass__定義子類時自動注冊子類
__class_getitem__Foo[int] 語法泛型支持
元類 __new__定義類本身時修改類結(jié)構(gòu)

總結(jié)

__new__ 的核心價值在于:在對象真正存在之前介入。當(dāng)你需要控制的不是"對象初始化后的狀態(tài)",而是"對象是哪個、是否創(chuàng)建、是什么類型"時,就該用 __new__。日常開發(fā)中最實用的三個場景是:單例、不可變類型繼承、工廠方法。

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

相關(guān)文章

  • 使用Keras建立模型并訓(xùn)練等一系列操作方式

    使用Keras建立模型并訓(xùn)練等一系列操作方式

    這篇文章主要介紹了使用Keras建立模型并訓(xùn)練等一系列操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Pandas 合并多個Dataframe(merge,concat)的方法

    Pandas 合并多個Dataframe(merge,concat)的方法

    今天小編就為大家分享一篇Pandas 合并多個Dataframe(merge,concat)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Flask添加路由的三種方法

    Flask添加路由的三種方法

    Flask 是一個流行的 Python Web 框架,它提供了多種方法來添加路由,本文詳細(xì)的介紹了Flask添加路由的三種方法,感興趣的可以了解一下
    2023-11-11
  • 利用python爬取古詩文網(wǎng)中各類古詩的方法

    利用python爬取古詩文網(wǎng)中各類古詩的方法

    這篇文章主要介紹了利用python爬取古詩文網(wǎng)中各類古詩的方法,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • 模型訓(xùn)練時GPU利用率太低的原因及解決

    模型訓(xùn)練時GPU利用率太低的原因及解決

    這篇文章主要介紹了模型訓(xùn)練時GPU利用率太低的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Django項目中實現(xiàn)使用qq第三方登錄功能

    Django項目中實現(xiàn)使用qq第三方登錄功能

    使用qq登錄的前提是已經(jīng)在qq互聯(lián)官網(wǎng)創(chuàng)建網(wǎng)站應(yīng)用并獲取到QQ互聯(lián)中網(wǎng)站應(yīng)用的APP ID和APP KEY。這篇文章主要介紹了Django項目中實現(xiàn)使用qq第三方登錄功能,需要的朋友可以參考下
    2019-08-08
  • Python如何檢驗樣本是否服從正態(tài)分布

    Python如何檢驗樣本是否服從正態(tài)分布

    這篇文章主要介紹了Python如何檢驗樣本是否服從正態(tài)分布問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python重寫方法和重寫特殊構(gòu)造方法

    python重寫方法和重寫特殊構(gòu)造方法

    這篇文章主要介紹了python重寫方法和重寫特殊構(gòu)造方法,對于父類的方法,只要他不符合子類模擬的實物的行為,都可以進行重寫,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Python3?hashlib?模塊基本用法詳解

    Python3?hashlib?模塊基本用法詳解

    在Python3中,hashlib模塊提供了一系列加密哈希算法的實現(xiàn),用于計算數(shù)據(jù)的哈希值,本文給大家介紹Python3?hashlib模塊基本用法,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • python接入使用百度翻譯流程

    python接入使用百度翻譯流程

    這篇文章主要介紹了利用Python接入百度翻譯的實現(xiàn)方法,從而實現(xiàn)中英文互譯的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-07-07

最新評論

尼勒克县| 广宁县| 游戏| 瑞金市| 资溪县| 墨竹工卡县| 修武县| 凯里市| 遂川县| 蓬莱市| 南郑县| 泽普县| 石林| 博湖县| 监利县| 屯昌县| 绥滨县| 沿河| 明水县| 白银市| 文昌市| 英德市| 文安县| 连云港市| 成安县| 格尔木市| 横峰县| 东丰县| 宿迁市| 镇宁| 玉屏| 潼南县| 南溪县| 江门市| 临安市| 东乡族自治县| 永嘉县| 张家界市| 诸暨市| 久治县| 宝鸡市|