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

深入理解Python虛擬機中魔術(shù)方法的使用

 更新時間:2023年05月24日 08:22:10   作者:一無是處的研究僧  
這篇文章主要給大家介紹在?cpython?當(dāng)中一些比較花里胡哨的魔術(shù)方法,以幫助我們自己實現(xiàn)比較花哨的功能,當(dāng)然這其中也包含一些也非常實用的魔術(shù)方法,需要的可以參考下

在本篇文章當(dāng)中主要給大家介紹在 cpython 當(dāng)中一些比較花里胡哨的魔術(shù)方法,以幫助我們自己實現(xiàn)比較花哨的功能,當(dāng)然這其中也包含一些也非常實用的魔術(shù)方法。

深入分析 hash 方法

在 Python 中,__hash__() 方法是一種特殊方法(也稱為魔術(shù)方法或雙下劃線方法),用于返回對象的哈希值。哈希值是一個整數(shù),用于在字典(dict)和集合(set)等數(shù)據(jù)結(jié)構(gòu)中進行快速查找和比較。__hash__() 方法在創(chuàng)建自定義的可哈希對象時非常有用,例如自定義類的實例,以便可以將這些對象用作字典的鍵或集合的元素。

下面是一些需要注意的問題和示例來幫助理解 __hash__() 方法:

  • 如果兩個對象相等(根據(jù) __eq__() 方法的定義),它們的哈希值應(yīng)該相等。即,如果 a == b 為真,則 hash(a) == hash(b) 也為真,這一點非常重要,因為我們在使用集合和字典的時候,就需要保證容器當(dāng)中每種對象只能夠有一個,如果不滿足這個條還的話,那么就可能會導(dǎo)致同一種對象在容器當(dāng)中會存在多個。
  • 重寫 __hash__() 方法通常需要同時重寫 __eq__() 方法,以確保對象的相等性和哈希值的一致性。
  • 如果對象沒有定義 __eq__方法,那么也不要定義 __hash__方法,因為如果遇到哈希值相等的對象時候,如果無法對兩個對象進行比較的話,那么也會導(dǎo)致容易當(dāng)中有多個相同的對象。
import random
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __eq__(self, other):
        return self.name == other.name and self.age == other.age
    def __hash__(self):
        return hash((self.name, self.age)) + random.randint(0, 1024)
    def __repr__(self):
        return f"[name={self.name}, age={self.age}]"
person1 = Person("Alice", 25)
person2 = Person("Alice", 25)
print(hash(person1))  
print(hash(person2))  
container = set()
container.add(person1)
container.add(person2)
print(container)

在上面代碼當(dāng)中我們重寫了 __hash__ 函數(shù),但是對象的哈希值每次調(diào)用的時候我們都加入一個隨機數(shù),因此即使 name 和 age 都相等,如果 hash 值不想等,那么可能會造成容器當(dāng)中存在多個相同的對象,上面的代碼就會造成相同的對象,上面的程序輸出結(jié)果如下所示:

1930083569156318318
1930083569156318292
{[name=Alice, age=25], [name=Alice, age=25]}

如果重寫上面的類對象:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __eq__(self, other):
        return self.name == other.name and self.age == other.age
    def __hash__(self):
        return hash((self.name, self.age))
    def __repr__(self):
        return f"[name={self.name}, age={self.age}]"

那么容器器當(dāng)中只會有一個對象。

如果我們只重寫了 __hash__方法的時候也會造成容器當(dāng)中有多個相同的對象。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # def __eq__(self, other):
    #     return self.name == other.name and self.age == other.age
    def __hash__(self):
        return hash((self.name, self.age)) # + random.randint(0, 1024)
    def __repr__(self):
        return f"[name={self.name}, age={self.age}]"

這是因為如果哈希值相同的時候還需要在比較兩個對象是否相等,如果相等那么就不需要將這個對象保存到容器當(dāng)中,如果不相等那么將會將這個對象加入到容器當(dāng)中。

bool 方法

在 Python 中,object.__bool__() 方法是一種特殊方法,用于定義對象的布爾值。它在使用布爾運算符(如 if 語句和邏輯運算)時自動調(diào)用。__bool__() 方法應(yīng)該返回一個布爾值,表示對象的真值。如果 __bool__() 方法未定義,Python 將嘗試調(diào)用 __len__() 方法來確定對象的真值。如果 __len__() 方法返回零,則對象被視為假;否則,對象被視為真。

下面是一些需要注意的事項來幫助理解 __bool__() 方法:

  • __bool__() 方法在對象被應(yīng)用布爾運算時自動調(diào)用。例如,在 if 語句中,對象的真值由 __bool__() 方法確定。
  • __bool__() 方法應(yīng)該返回一個布爾值(True 或 False)。
  • 如果 __bool__() 方法未定義,Python 將嘗試調(diào)用 __len__() 方法來確定對象的真值。
  • 當(dāng)對象的長度為零時,即 __len__() 方法返回零,對象被視為假;否則,對象被視為真。
  • 如果既未定義 __bool__() 方法,也未定義 __len__() 方法,則對象默認為真。

下面是一個示例,展示了如何在自定義類中使用 __bool__() 方法:

class NonEmptyList:
    def __init__(self, items):
        self.items = items
    def __bool__(self):
        return len(self.items) > 0
my_list = NonEmptyList([1, 2, 3])
if my_list:
    print("The list is not empty.")
else:
    print("The list is empty.")

對象的屬性訪問

在Python中,我們可以通過一些特殊方法來定制屬性訪問的行為。本文將深入介紹這些特殊方法,包括__getitem__()、__setitem__()、__delitem__()和__getattr__()方法,以幫助更好地理解屬性訪問的機制和應(yīng)用場景。

__getitem__()方法是用于索引操作的特殊方法。當(dāng)我們通過索引訪問對象的屬性時,Python會自動調(diào)用該方法,并傳入索引值作為參數(shù)。我們可以在該方法中實現(xiàn)對屬性的獲取操作,并返回相應(yīng)的值。

class MyList:
    def __init__(self):
        self.data = []
    def __getitem__(self, index):
        return self.data[index]
my_list = MyList()
my_list.data = [1, 2, 3]
print(my_list[1])  # 輸出: 2

在上面的例子中,我們定義了一個名為MyList的類,它具有一個屬性data,該屬性是一個列表。通過重寫__getitem__()方法,我們使得可以通過索引來訪問MyList對象的data屬性。當(dāng)我們使用my_list[1]的形式進行索引操作時,Python會自動調(diào)用__getitem__()方法,并將索引值1作為參數(shù)傳遞給該方法。

__setitem__()方法用于屬性的設(shè)置操作,即通過索引為對象的屬性賦值。當(dāng)我們使用索引操作并賦值給對象的屬性時,Python會自動調(diào)用__setitem__()方法,并傳入索引值和賦值的值作為參數(shù)。

class MyList:
    def __init__(self):
        self.data = [0 for i in range(2)]
    def __setitem__(self, index, value):
        self.data[index] = value
my_list = MyList()
my_list[0] = 1
my_list[1] = 2
print(my_list.data)  # 輸出: [1, 2]

在上述示例中,我們重寫了__setitem__()方法來實現(xiàn)對對象屬性的設(shè)置操作。當(dāng)我們執(zhí)行my_list[0] = 1和my_list[1] = 2的賦值操作時,Python會自動調(diào)用__setitem__()方法,并將索引值和賦值的值傳遞給該方法。在__setitem__()方法中,我們將值賦給了對象的data屬性的相應(yīng)索引位置。

__delitem__()方法用于刪除對象屬性的特殊方法。當(dāng)我們使用del語句刪除對象屬性時,Python會自動調(diào)用__delitem__()方法,并傳入要刪除的屬性的索引值作為參數(shù)。

class MyDict:
    def __init__(self):
        self.data = dict()
    def __delitem__(self, key):
        print("In __delitem__")
        del self.data[key]
obj = MyDict()
obj.data["key"] = "val"
del obj["key"] # 輸出 In __delitem__

__getattr__() 是一個特殊方法,用于在訪問不存在的屬性時自動調(diào)用。它接收一個參數(shù),即屬性名,然后返回相應(yīng)的值或引發(fā) AttributeError 異常。

class MyClass:
    def __getattr__(self, name):
        if name == 'color':
            return 'blue'
        else:
            raise AttributeError(f"'MyClass' object has no attribute '{name}'")
my_obj = MyClass()
print(my_obj.color)  # 輸出: blue
print(my_obj.size)   # 引發(fā) AttributeError: 'MyClass' object has no attribute 'size'

在上面的示例中,當(dāng)訪問 my_obj.color 時,由于 color 屬性不存在,Python 會自動調(diào)用 __getattr__() 方法,并返回預(yù)定義的值 'blue'。而當(dāng)訪問 my_obj.size 時,由于該屬性也不存在,__getattr__() 方法會引發(fā) AttributeError 異常。

__setattr__() 是一個特殊方法,用于在設(shè)置屬性值時自動調(diào)用。它接收兩個參數(shù),即屬性名和屬性值。我們可以在該方法中對屬性進行處理、驗證或記錄。

class MyClass:
    def __init__(self):
        self.color = 'red' # 輸出:Setting attribute 'color' to 'red'
    def __setattr__(self, name, value):
        print(f"Setting attribute '{name}' to '{value}'")
        super().__setattr__(name, value)
my_obj = MyClass()
my_obj.color = 'blue'  # 輸出: Setting attribute 'color' to 'blue'

當(dāng)我們使用 . 的方式去訪問對象屬性的時候,首先會調(diào)用對象的 __getattribute__ 函數(shù),如果屬性不存在才會調(diào)用 __getattr__。當(dāng) __getattribute__ 方法無法找到指定的屬性時,Python 會調(diào)用 __getattr__ 方法。以下是在之前的示例類 CustomClass 上添加 __getattr__ 方法的代碼:

class CustomClass:
    def __init__(self):
        self.attribute = "Hello, world!"
    def __getattribute__(self, name):
        print(f"Accessing attribute: {name}")
        return super().__getattribute__(name)
    def __getattr__(self, name):
        print(f"Attribute {name} not found")
        return None

在這個示例中,我們在 CustomClass 中添加了 __getattr__ 方法。當(dāng) __getattribute__ 方法無法找到指定的屬性時,會自動調(diào)用 __getattr__ 方法,并打印出屬性名稱 "attribute" 以及未找到屬性的提示信息。

我們執(zhí)行下面的代碼:

obj = CustomClass()
print(obj.attribute)
print(obj.nonexistent_attribute)

輸出結(jié)果如下所示:

Accessing attribute: attribute
Hello, world!
Accessing attribute: nonexistent_attribute
Attribute nonexistent_attribute not found
None

首先,我們訪問存在的屬性 attribute,此時 __getattribute__ 方法被調(diào)用,并打印出屬性名稱 "attribute",然后返回屬性的實際值 "Hello, world!"。接著,我們嘗試訪問不存在的屬性 nonexistent_attribute,由于 __getattribute__ 方法無法找到該屬性,因此會調(diào)用 __getattr__ 方法,并打印出屬性名稱 "nonexistent_attribute" 以及未找到屬性的提示信息,然后返回 None。

上下文管理器

當(dāng)我們需要在特定的代碼塊執(zhí)行前后進行一些操作時,上下文管理器是一種非常有用的工具。上下文管理器可以確保資源的正確分配和釋放,無論代碼塊是否出現(xiàn)異常。在Python中,我們可以通過實現(xiàn) __enter__ 和 __exit__ 方法來創(chuàng)建自定義的上下文管理器。

下面是一個簡單的上下文管理器示例,展示了如何使用 object.__enter__ 和 object.__exit__ 方法來創(chuàng)建一個文件操作的上下文管理器:

class FileContextManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()
with FileContextManager('example.txt', 'w') as file:
    file.write('Hello, world!')

在上述示例中,F(xiàn)ileContextManager 類實現(xiàn)了 __enter__ 和 __exit__ 方法。在 __enter__ 方法中,我們打開文件并返回文件對象,這樣在 with 語句塊中就可以使用該文件對象。在 __exit__ 方法中,我們關(guān)閉文件。

無論代碼塊是否拋出異常,__exit__ 方法都會被調(diào)用來確保文件被正確關(guān)閉。這樣可以避免資源泄露和文件鎖定等問題。使用上下文管理器可以簡化代碼,并提供一致的資源管理方式,特別適用于需要打開和關(guān)閉資源的情況,如文件操作、數(shù)據(jù)庫連接等。

上述上下文管理器的 __exit__ 方法有三個參數(shù):exc_type、exc_value 和 traceback。下面是對這些參數(shù)的詳細介紹:

  • exc_type(異常類型):這個參數(shù)表示引發(fā)的異常的類型。如果在上下文管理器的代碼塊中沒有引發(fā)異常,它的值將為 None。如果有異常被引發(fā),exc_type 將是引發(fā)異常的類型。
  • exc_value(異常值):這個參數(shù)表示引發(fā)的異常的實例。它包含了關(guān)于異常的詳細信息,如錯誤消息。如果沒有異常被引發(fā),它的值也將為 None。
  • traceback(回溯信息):這個參數(shù)是一個回溯對象,它包含了關(guān)于異常的堆棧跟蹤信息。它提供了導(dǎo)致異常的代碼路徑和調(diào)用關(guān)系。如果沒有異常被引發(fā),它的值將為 None。

以上就是深入理解Python虛擬機中魔術(shù)方法的使用的詳細內(nèi)容,更多關(guān)于Python魔術(shù)方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)的三層BP神經(jīng)網(wǎng)絡(luò)算法示例

    Python實現(xiàn)的三層BP神經(jīng)網(wǎng)絡(luò)算法示例

    這篇文章主要介紹了Python實現(xiàn)的三層BP神經(jīng)網(wǎng)絡(luò)算法,結(jié)合完整實例形式分析了Python三層BP神經(jīng)網(wǎng)絡(luò)算法的具體實現(xiàn)與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • Python實現(xiàn)的多線程http壓力測試代碼

    Python實現(xiàn)的多線程http壓力測試代碼

    這篇文章主要介紹了Python實現(xiàn)的多線程http壓力測試代碼,結(jié)合實例形式分析了Python多線程操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • python實現(xiàn)進度條的多種實現(xiàn)

    python實現(xiàn)進度條的多種實現(xiàn)

    這篇文章主要介紹了python實現(xiàn)進度條的多種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python3獲取拉勾網(wǎng)招聘信息的方法實例

    Python3獲取拉勾網(wǎng)招聘信息的方法實例

    這篇文章主要給大家介紹了關(guān)于Python3獲取拉勾網(wǎng)招聘信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 快速一鍵生成Python爬蟲請求頭

    快速一鍵生成Python爬蟲請求頭

    這篇文章主要介紹了如何快速一鍵生成Python爬蟲請求頭,幫助大家更好的理解和學(xué)習(xí)使用python爬蟲,感興趣的朋友可以了解下
    2021-03-03
  • Pandas提取單元格的值操作

    Pandas提取單元格的值操作

    這篇文章主要介紹了Pandas提取單元格的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python3中rank函數(shù)的用法

    python3中rank函數(shù)的用法

    今天小編就為大家分享一篇python3中rank函數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • pydantic-resolve嵌套數(shù)據(jù)結(jié)構(gòu)生成LoaderDepend管理contextvars

    pydantic-resolve嵌套數(shù)據(jù)結(jié)構(gòu)生成LoaderDepend管理contextvars

    這篇文章主要為大家介紹了pydantic-resolve解決嵌套數(shù)據(jù)結(jié)構(gòu)生成LoaderDepend管理contextvars的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-04-04
  • Python3 re.search()方法的具體使用

    Python3 re.search()方法的具體使用

    本文主要介紹了Python3 re.search()方法的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python 腳本死鎖問題與解決方案

    Python 腳本死鎖問題與解決方案

    在腳本中,可以創(chuàng)建一個隊列來存儲子進程的輸出,然后由主進程從隊列中讀取輸出并進行處理,這篇文章主要介紹了Python 腳本死鎖問題與解決方案,需要的朋友可以參考下
    2024-06-06

最新評論

渝中区| 正定县| 开封市| 阿城市| 黎平县| 天镇县| 大洼县| 舟山市| 通化县| 漾濞| 巴中市| 铜川市| 伊吾县| 汉中市| 河源市| 普格县| 三台县| 仙游县| 宜宾市| 临潭县| 攀枝花市| 公主岭市| 桂东县| 濉溪县| 监利县| 旅游| 梓潼县| 新绛县| 博客| 潢川县| 南涧| 绥芬河市| 文化| 沂南县| 渭南市| 榆社县| 丹凤县| 麦盖提县| 涞源县| 阳原县| 揭阳市|