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

Python中的?__init__、__new__?和?__call__示例詳解

 更新時(shí)間:2025年09月01日 10:26:58   作者:哈拉索zbc  
這篇文章主要介紹了Python中__init__、__new__?和?__call__的相關(guān)資料,它們分別負(fù)責(zé)對象創(chuàng)建、初始化和調(diào)用,用于實(shí)現(xiàn)單例模式、裝飾器等高級功能,需要的朋友可以參考下

這三個(gè)特殊方法是 Python 面向?qū)ο缶幊讨械暮诵臉?gòu)造機(jī)制,分別在對象生命周期的不同階段發(fā)揮作用:

1.__init__方法:對象初始化器

  • 作用:初始化新創(chuàng)建的實(shí)例對象

  • 調(diào)用時(shí)機(jī):在 __new__ 創(chuàng)建實(shí)例之后自動(dòng)調(diào)用

  • 參數(shù):第一個(gè)參數(shù)必須是 self(指向新實(shí)例)

  • 返回值:無(必須返回 None

  • 核心職責(zé)

    • 設(shè)置實(shí)例屬性的初始值

    • 執(zhí)行必要的初始化操作

    • 不負(fù)責(zé)創(chuàng)建對象本身

      class Person:
          def __init__(self, name, age):
              print("__init__ called")
              self.name = name  # 設(shè)置實(shí)例屬性
              self.age = age
      
      # 使用
      p = Person("Alice", 30)
      # 輸出:__init__ called
      print(p.name)  # Alice

      關(guān)鍵點(diǎn)

    • 每個(gè)類可以定義自己的 __init__

    • 如果未定義,繼承父類的 __init__

    • 可以調(diào)用父類的 __init__super().__init__(args)

    • 不是構(gòu)造函數(shù)(實(shí)際創(chuàng)建對象的是 __new__

2.__new__方法:對象創(chuàng)建器

  • 作用:實(shí)際創(chuàng)建類的新實(shí)例

  • 調(diào)用時(shí)機(jī):在 __init__ 之前自動(dòng)調(diào)用

  • 參數(shù):第一個(gè)參數(shù)必須是 cls(指向當(dāng)前類)

  • 返回值:必須返回創(chuàng)建好的實(shí)例對象

  • 核心職責(zé)

    • 控制實(shí)例創(chuàng)建過程

    • 決定是否返回新實(shí)例或已有實(shí)例

    • 可以返回其他類的實(shí)例

      class Singleton:
          _instance = None
          
          def __new__(cls, *args, **kwargs):
              print("__new__ called")
              if not cls._instance:
                  # 創(chuàng)建新實(shí)例(調(diào)用父類的__new__)
                  cls._instance = super().__new__(cls)  
              return cls._instance  # 返回實(shí)例(新或已有)
      
          def __init__(self, value):
              print("__init__ called")
              self.value = value
      
      # 使用
      s1 = Singleton(10)
      # 輸出: __new__ called -> __init__ called
      s2 = Singleton(20)
      # 輸出: __new__ called -> __init__ called
      print(s1 is s2)  # True(相同實(shí)例)
      print(s1.value)  # 20(注意:__init__被再次調(diào)用?。?
      

      關(guān)鍵點(diǎn)

    • 必須返回有效的對象實(shí)例

    • 如果返回非當(dāng)前類實(shí)例,__init__ 不會被調(diào)用

    • 常用場景:單例模式、不可變類型子類化

    • 元類中 __new__ 創(chuàng)建的是類對象本身

3.__call__方法:對象調(diào)用器

  • 作用:使類的實(shí)例可以像函數(shù)一樣被調(diào)用

  • 調(diào)用時(shí)機(jī):當(dāng)實(shí)例后加 () 時(shí)自動(dòng)調(diào)用

  • 參數(shù):第一個(gè)參數(shù)必須是 self(指向?qū)嵗?/p>

  • 返回值:任意類型值

  • 核心職責(zé)

    • 定義實(shí)例作為函數(shù)的行為

    • 實(shí)現(xiàn)裝飾器類

    • 創(chuàng)建有狀態(tài)的函數(shù)對象

class Adder:
    def __init__(self, base):
        self.base = base
    
    def __call__(self, x):
        print("__call__ invoked")
        return self.base + x

# 使用
add5 = Adder(5)  # 創(chuàng)建可調(diào)用對象
print(add5(3))   # 輸出: __call__ invoked -> 8
print(add5(10))  # 輸出: __call__ invoked -> 15

高級應(yīng)用:裝飾器類

class TraceCalls:
    def __init__(self, func):
        self.func = func
        self.call_count = 0
    
    def __call__(self, *args, **kwargs):
        self.call_count += 1
        print(f"Call #{self.call_count} to {self.func.__name__}")
        return self.func(*args, **kwargs)

@TraceCalls
def multiply(a, b):
    return a * b

print(multiply(3, 4))
# 輸出: 
# Call #1 to multiply
# 12

print(multiply(5, 6))
# 輸出:
# Call #2 to multiply
# 30

三者的協(xié)作流程

class Example:
    def __new__(cls, *args, **kwargs):
        print("1. __new__: Creating instance")
        instance = super().__new__(cls)
        return instance
    
    def __init__(self, value):
        print("2. __init__: Initializing instance")
        self.value = value
    
    def __call__(self, multiplier):
        print("3. __call__: Invoking instance")
        return self.value * multiplier

# 完整生命周期
e = Example(10)  
# 輸出:
# 1. __new__: Creating instance
# 2. __init__: Initializing instance

result = e(5)    
# 輸出:
# 3. __call__: Invoking instance
print(result)  # 50

關(guān)鍵對比表

特性__new____init____call__
角色對象創(chuàng)建器對象初始化器對象調(diào)用器
調(diào)用時(shí)機(jī)創(chuàng)建實(shí)例時(shí)(最先)__new__ 之后實(shí)例被調(diào)用時(shí)
首參數(shù)cls (類引用)self (實(shí)例引用)self (實(shí)例引用)
返回值必須返回實(shí)例對象必須返回 None可返回任意值
主要用途控制實(shí)例創(chuàng)建過程初始化實(shí)例屬性使實(shí)例可像函數(shù)一樣調(diào)用
是否必需不定義則用 object.__new__不定義則跳過初始化不定義則實(shí)例不可調(diào)用
典型場景單例模式、不可變類型常規(guī)對象初始化裝飾器類、函數(shù)對象

高級應(yīng)用場景

1. 不可變類型擴(kuò)展

class UppercaseStr(str):
    def __new__(cls, value):
        # 在創(chuàng)建前修改值
        return super().__new__(cls, value.upper())

s = UppercaseStr("hello")
print(s)  # "HELLO"(不可變對象在創(chuàng)建時(shí)確定值)

2. 對象工廠

class Animal:
    def __new__(cls, animal_type, *args):
        if animal_type == "dog":
            return Dog(*args)
        elif animal_type == "cat":
            return Cat(*args)
        raise ValueError(f"Unknown animal: {animal_type}")

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

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

d = Animal("dog", "Buddy")
print(type(d), d.name)  # <class '__main__.Dog'> Buddy

3. 帶狀態(tài)的裝飾器

class Retry:
    def __init__(self, max_attempts=3):
        self.max_attempts = max_attempts
    
    def __call__(self, func):
        def wrapper(*args, **kwargs):
            for attempt in range(1, self.max_attempts+1):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Attempt {attempt} failed: {e}")
            raise RuntimeError("All attempts failed")
        return wrapper

@Retry(max_attempts=2)
def risky_operation():
    import random
    if random.random() < 0.7:
        raise ValueError("Random failure")
    return "Success"

print(risky_operation())

常見陷阱與解決方案

1. __init__ 中忘記返回 None

class Mistake:
    def __init__(self):
        return 42  # TypeError: __init__() should return None

2.__new__ 忘記返回實(shí)例

class BadClass:
    def __new__(cls):
        print("Forgot to return instance")  # 返回None -> TypeError

3.單例模式中的重復(fù)初始化

解決方案:使用標(biāo)志位控制

class SafeSingleton:
    _instance = None
    _initialized = False
    
    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance
    
    def __init__(self):
        if not self.__class__._initialized:
            # 初始化代碼
            self.__class__._initialized = True

4.__call__ 與 __init__ 參數(shù)混淆

掌握這三個(gè)特殊方法的區(qū)別和協(xié)作機(jī)制,能夠讓你更精細(xì)地控制 Python 對象的整個(gè)生命周期,實(shí)現(xiàn)更高級的設(shè)計(jì)模式。

總結(jié)

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

相關(guān)文章

  • 在Linux系統(tǒng)上通過uWSGI配置Nginx+Python環(huán)境的教程

    在Linux系統(tǒng)上通過uWSGI配置Nginx+Python環(huán)境的教程

    這篇文章主要介紹了在Linux系統(tǒng)上通過uWSGI配置Nginx+Python環(huán)境的教程,示例中為Ubuntu系統(tǒng)并且默認(rèn)使用系統(tǒng)中自帶的Python解釋器,需要的朋友可以參考下
    2015-12-12
  • Python音頻處理庫pydub的使用示例詳解

    Python音頻處理庫pydub的使用示例詳解

    pydub是一個(gè)輕量級的音頻處理庫,安裝方便,使用簡單,這篇文章主要為大家詳細(xì)介紹了pydub的具體使用,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下
    2023-11-11
  • Python搭建代理IP池實(shí)現(xiàn)檢測IP的方法

    Python搭建代理IP池實(shí)現(xiàn)檢測IP的方法

    這篇文章主要介紹了Python搭建代理IP池實(shí)現(xiàn)檢測IP的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • windows下python模擬鼠標(biāo)點(diǎn)擊和鍵盤輸示例

    windows下python模擬鼠標(biāo)點(diǎn)擊和鍵盤輸示例

    這篇文章主要介紹了windows下python模擬鼠標(biāo)點(diǎn)擊和鍵盤輸示例,需要的朋友可以參考下
    2014-02-02
  • django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟

    django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟

    這篇文章主要介紹了django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 使用Python在Word中查找并高亮指定文本

    使用Python在Word中查找并高亮指定文本

    當(dāng)你需要在長文檔或報(bào)告中快速找到特定的關(guān)鍵詞或短語,Word中提供的查找并高亮這一功能可以幫助你迅速定位這些內(nèi)容,本文將介紹如何使用Python在Word中查找并突出顯示指定的文本,需要的朋友可以參考下
    2024-03-03
  • Python-ElasticSearch搜索查詢的講解

    Python-ElasticSearch搜索查詢的講解

    今天小編就為大家分享一篇關(guān)于Python-ElasticSearch搜索查詢的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Pycharm配置遠(yuǎn)程SSH服務(wù)器實(shí)現(xiàn)(切換不同虛擬環(huán)境)

    Pycharm配置遠(yuǎn)程SSH服務(wù)器實(shí)現(xiàn)(切換不同虛擬環(huán)境)

    本文主要介紹了Pycharm配置遠(yuǎn)程SSH服務(wù)器實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python爬蟲看看虎牙女主播中誰最“頂”步驟詳解

    python爬蟲看看虎牙女主播中誰最“頂”步驟詳解

    這篇文章主要介紹了python爬蟲看看虎牙女主播中誰最“頂”,本文分步驟通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 解決pyinstaller打包pyqt5的問題

    解決pyinstaller打包pyqt5的問題

    今天小編就為大家分享一篇解決pyinstaller打包pyqt5的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論

四子王旗| 广水市| 大安市| 商城县| 中宁县| 景谷| 梅河口市| 新安县| 乐清市| 青川县| 和静县| 台山市| 逊克县| 深泽县| 蒲江县| 象州县| 宁陵县| 华安县| 澄城县| 蒲城县| 民权县| 太白县| 江都市| 广宁县| 永登县| 乳山市| 静乐县| 永嘉县| 睢宁县| 炎陵县| 庄河市| 商南县| 临桂县| 朝阳区| 嵊州市| 莲花县| 胶州市| 竹溪县| 合水县| 义马市| 濮阳市|