欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 冷門魔術(shù)方法小結(jié)

 更新時間:2025年04月16日 10:13:34   作者:予早隨筆  
本文主要介紹了Python 冷門魔術(shù)方法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

__init_subclass__

https://docs.python.org/3/reference/datamodel.html#object.__init_subclass__Python 3.6 新增。

父類派生子類后會調(diào)用該方法,方法中 cls 指向派生出的子類。

  • __init_subclass__被定義為普通方法,將會被隱式轉(zhuǎn)換為類方法,故不必使用@classmethod裝飾器
  • metaclass 不會被傳給__init_subclass__
  • 傳給一個新類的關(guān)鍵字參數(shù)會被傳給父類的__init_subclass__。為保證與父類__init_subclass__兼容,應當將關(guān)鍵字參數(shù)中僅子類__init_subclass__需要的參數(shù)去掉后再傳入父類__init_subclass__
class Base:
    def __init_subclass__(cls, /, name, **kwargs):
        super().__init_subclass__(**kwargs)
        print("Base __init_subclass__ called")
        cls.x = {}
        cls.name = name


class A(Base, name="Jack"):
    def __init__(self):
        super().__init__()
        print("A __init__ called")

    def __new__(cls, *args, **kwargs):
        super().__new__(cls)
        print("A __new__ called")


print(A.x)
print(A.name)
# Base __init_subclass__ called
# {}
# Jack
class A:
    def __init__(self):
        super().__init__()
        print("A __init__ called")

    def __new__(cls, *args, **kwargs):
        super().__new__(cls)
        print("A __new__ called")

    @classmethod
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__()
        print(kwargs)
        print("A __init_subclass__ called")


class B(A, bbb=12):
    def __init__(self):
        super().__init__()
        print("B __init__ called")

    def __new__(cls, *args, **kwargs):
        super().__new__(cls)
        print("B __new__ called")

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__()
        print("B __init_subclass__ called")


class C(B, ccc=12):
    def __init__(self):
        super().__init__()
        print("C __init__ called")

    def __new__(cls, *args, **kwargs):
        super().__new__(cls)
        print("C __new__ called")

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__()
        print("C __init_subclass__ called")

__class_getitem__

__class_getitem__方法的目的是允許標準庫泛型類的運行時形參化以更方便地對這些類應用 類型提示。

  • __class_getitem__被定義為普通方法,將會被隱式轉(zhuǎn)換為類方法,故不必使用@classmethod裝飾器
  • __class_getitem__方法應當返回一個 GenericAlias 類型

https://docs.python.org/3/reference/datamodel.html#object.__class_getitem__

from typing import List


class A:

    def __class_getitem__(cls, item):
        print(item)
        return "abc"


print(A[0])

if __name__ == '__main__':
    int_arr_type = List[int]
    list1: int_arr_type = [1]
    list2: int_arr_type = []
    print(int_arr_type)

__instancecheck__與__subclasscheck__

  • __instancecheck__可以自定義實例檢查邏輯
  • __subclasscheck__可以自定義子類檢查邏輯
from typing import Any

class Meta(type):
    def __instancecheck__(self, instance: Any) -> bool:
        print("Instance Check")
        print(instance)
        return True

    def __subclasscheck__(self, subclass: type) -> bool:
        print("Subclass Check")
        print(subclass)
        if subclass is int:
            return True
        return False


class A(metaclass=Meta):
    pass


o = A()

print(isinstance(123, A))

print()

print(issubclass(int, A))

# Instance Check
# 123
# True
# 
# Subclass Check
# <class 'int'>
# True

__prepare__

https://peps.python.org/pep-3115

Python 3.0 新增。

__prepare__用于為類準備命名空間。

  • __prepare__定義在元類中并且必須被顯式定義為類方法
  • __prepare__方法返回一個映射對象
  • Python 執(zhí)行類定義語句,會首先調(diào)用其元類__prepare__方法,獲得一個映射對象,該映射對象會被作為該類的命名空間,類的屬性和方法會被存儲在該映射對象中,隨后映射對象會成為該類的__dict__屬性。
import collections
from typing import Any, Mapping

# 創(chuàng)建一個 OrderedDict 對象作為字典
global_dict = collections.OrderedDict()

global_dict["global_dict_name"] = "global_dict"


class MyMeta(type):

    @classmethod
    def __prepare__(metacls, __name: str, __bases: tuple[type, ...], **kwargs: Any) -> Mapping[str, object]:
        print(metacls, __name, __bases, kwargs)
        return global_dict


class MyClass(metaclass=MyMeta):
    a = 1
    b = 2
    c = 3


print(MyClass.__dict__)
print("global_dict_name" in MyClass.__dict__)

# <class '__main__.MyMeta'> MyClass () {}
# {'global_dict_name': 'global_dict', '__module__': '__main__', '__firstlineno__': 18, 'a': 1, 'b': 2, 'c': 3, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None}
# True

__mro_entries__

https://docs.python.org/3/reference/datamodel.html#object.__mro_entries__

若某個類的父類不是type的實例(此時父類就是一個普通對象),則定義該類時其基類會被替換為父類中定義的__mro_entries__方法的返回值,若父類中沒有定義__mro_entries__方法,此時類的定義會報錯AttributeError: 'xxx' object has no attribute 'mro',因為無法進行MRO。

class A1:
    ...

class A2:
    def __mro_entries__(self, bases):
        return (dict,)

class B1(A1):
    print(type(A1), type(A1) is type)
    ...

class B2(A2()):
    print(type(A2()), type(A2()) is not type)
    ...

print(B1.mro())
print(B2.mro())
# <class 'type'> True
# <class '__main__.A2'> True
# [<class '__main__.B1'>, <class '__main__.A1'>, <class 'object'>]
# [<class '__main__.B2'>, <class 'dict'>, <class 'object'>]

到此這篇關(guān)于Python 冷門魔術(shù)方法小結(jié)的文章就介紹到這了,更多相關(guān)Python 冷門魔術(shù)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • python基于opencv檢測程序運行效率

    python基于opencv檢測程序運行效率

    這篇文章主要介紹了python基于opencv檢測程序運行效率,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • python  fire庫的使用實例教程

    python  fire庫的使用實例教程

    fire是python中用于生成命令行界面(Command Line Interfaces, CLIs)的工具,不需要做任何額外的工作,只需要從主模塊中調(diào)用fire.Fire(),它會自動將你的代碼轉(zhuǎn)化為CLI,F(xiàn)ire()的參數(shù)可以說任何的python對象,對python fire庫使用感興趣的朋友一起看看吧
    2022-12-12
  • python解決12306登錄驗證碼的實現(xiàn)

    python解決12306登錄驗證碼的實現(xiàn)

    這篇文章主要介紹了python解決12306登錄驗證碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Python help()函數(shù)用法詳解

    Python help()函數(shù)用法詳解

    這篇文章主要介紹了Python help()函數(shù)的作用,并舉例說明它的詳細用法,需要的朋友可以參考下
    2014-03-03
  • python智聯(lián)招聘爬蟲并導入到excel代碼實例

    python智聯(lián)招聘爬蟲并導入到excel代碼實例

    這篇文章主要介紹了python智聯(lián)招聘爬蟲并導入到excel代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • python GUI庫圖形界面開發(fā)之PyQt5時間控件QTimer詳細使用方法與實例

    python GUI庫圖形界面開發(fā)之PyQt5時間控件QTimer詳細使用方法與實例

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5時間控件QTimer詳細使用方法與實例,需要的朋友可以參考下
    2020-02-02
  • Python如何設置Excel單元格邊框

    Python如何設置Excel單元格邊框

    在數(shù)據(jù)驅(qū)動的業(yè)務場景中,自動化設置Excel單元格邊框成為提升數(shù)據(jù)處理效率的關(guān)鍵環(huán)節(jié),下面我們就來講講如何使用Python設置Excel工作簿中單元格的邊框吧
    2025-04-04
  • python中注釋用法簡單示例

    python中注釋用法簡單示例

    注釋即對程序代碼的解釋,在寫程序時需適當使用注釋,以方便自己和他人理解程序各部分的作用,下面這篇文章主要給大家介紹了關(guān)于python中注釋用法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • python正則表達式完成車牌號檢驗的代碼實例

    python正則表達式完成車牌號檢驗的代碼實例

    這篇文章主要給大家介紹了關(guān)于python正則表達式完成車牌號檢驗的相關(guān)資料,在Python中正則表達式是一種用于匹配和操作字符串的強大工具,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • AI生成圖片Stable?Diffusion環(huán)境搭建與運行方法

    AI生成圖片Stable?Diffusion環(huán)境搭建與運行方法

    Stable?Diffusion是一種基于擴散過程的生成模型,由Ge?et?al.在2021年提出,該模型利用了隨機變量的穩(wěn)定分布,通過遞歸地應用擴散過程來生成高質(zhì)量的圖像,這篇文章主要介紹了AI圖片生成Stable?Diffusion環(huán)境搭建與運行,需要的朋友可以參考下
    2023-05-05

最新評論