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

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

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

__init_subclass__

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

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

  • __init_subclass__被定義為普通方法,將會(huì)被隱式轉(zhuǎn)換為類方法,故不必使用@classmethod裝飾器
  • metaclass 不會(huì)被傳給__init_subclass__
  • 傳給一個(gè)新類的關(guān)鍵字參數(shù)會(huì)被傳給父類的__init_subclass__。為保證與父類__init_subclass__兼容,應(yīng)當(dāng)將關(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__方法的目的是允許標(biāo)準(zhǔn)庫(kù)泛型類的運(yùn)行時(shí)形參化以更方便地對(duì)這些類應(yīng)用 類型提示。

  • __class_getitem__被定義為普通方法,將會(huì)被隱式轉(zhuǎn)換為類方法,故不必使用@classmethod裝飾器
  • __class_getitem__方法應(yīng)當(dāng)返回一個(gè) 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__可以自定義實(shí)例檢查邏輯
  • __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__用于為類準(zhǔn)備命名空間。

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

# 創(chuàng)建一個(gè) OrderedDict 對(duì)象作為字典
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__

若某個(gè)類的父類不是type的實(shí)例(此時(shí)父類就是一個(gè)普通對(duì)象),則定義該類時(shí)其基類會(huì)被替換為父類中定義的__mro_entries__方法的返回值,若父類中沒(méi)有定義__mro_entries__方法,此時(shí)類的定義會(huì)報(bào)錯(cuò)AttributeError: 'xxx' object has no attribute 'mro',因?yàn)闊o(wú)法進(jìn)行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 冷門(mén)魔術(shù)方法小結(jié)的文章就介紹到這了,更多相關(guān)Python 冷門(mén)魔術(shù)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • windows下添加Python環(huán)境變量的方法匯總

    windows下添加Python環(huán)境變量的方法匯總

    默認(rèn)情況下,在windows下安裝python之后,系統(tǒng)并不會(huì)自動(dòng)添加相應(yīng)的環(huán)境變量。此時(shí)不能在命令行直接使用python命令。今天我們就來(lái)看下,如何簡(jiǎn)單快捷的在windows下添加Python環(huán)境變量
    2018-05-05
  • pytorch中的weight-initilzation用法

    pytorch中的weight-initilzation用法

    這篇文章主要介紹了pytorch中的weight-initilzation用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • pandas DataFrame tail的使用小結(jié)

    pandas DataFrame tail的使用小結(jié)

    本文主要介紹了pandas DataFrame tail的使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • python之no module named xxxx以及虛擬環(huán)境配置過(guò)程

    python之no module named xxxx以及虛擬環(huán)境配置過(guò)程

    在Python開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到環(huán)境配置和包管理的問(wèn)題,主要原因包括未安裝所需包或使用虛擬環(huán)境導(dǎo)致的,通過(guò)pip install命令安裝缺失的包是解決問(wèn)題的一種方式,此外,使用虛擬環(huán)境,例如PyCharm支持的Virtualenv,可以為每個(gè)項(xiàng)目創(chuàng)建獨(dú)立的運(yùn)行環(huán)境
    2024-10-10
  • pytorch部署到j(luò)upyter中的問(wèn)題及解決方案

    pytorch部署到j(luò)upyter中的問(wèn)題及解決方案

    這篇文章主要介紹了pytorch部署到j(luò)upyter中,在這里需要注意我再輸入的時(shí)候出現(xiàn)了一些無(wú)法定位的提示,但是我的電腦沒(méi)有影響使用jupyter,還是可以使用jupyter并且可以import torch,本文給大家講解的非常詳細(xì),需要的朋友參考下吧
    2022-05-05
  • Python結(jié)合wxPython實(shí)現(xiàn)AI繪圖提示詞生成器

    Python結(jié)合wxPython實(shí)現(xiàn)AI繪圖提示詞生成器

    這篇文章主要為大家詳細(xì)介紹了Python如何基于wxPython開(kāi)發(fā)一個(gè)AI繪圖提示詞生成器,專門(mén)用于幫助用戶快速構(gòu)建和管理Stable?Diffusion、Midjourney等AI繪圖工具的提示詞,感興趣的小伙伴可以了解下
    2025-12-12
  • python動(dòng)態(tài)加載包的方法小結(jié)

    python動(dòng)態(tài)加載包的方法小結(jié)

    這篇文章主要介紹了python動(dòng)態(tài)加載包的方法,結(jié)合實(shí)例形式總結(jié)分析了Python動(dòng)態(tài)加載模塊,動(dòng)態(tài)增加屬性及動(dòng)態(tài)加載包的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-04-04
  • tensorflow使用freeze_graph.py將ckpt轉(zhuǎn)為pb文件的方法

    tensorflow使用freeze_graph.py將ckpt轉(zhuǎn)為pb文件的方法

    這篇文章主要介紹了tensorflow使用freeze_graph.py將ckpt轉(zhuǎn)為pb文件的方法,需要的朋友可以參考下
    2020-04-04
  • wxpython中利用線程防止假死的實(shí)現(xiàn)方法

    wxpython中利用線程防止假死的實(shí)現(xiàn)方法

    上午抽空學(xué)習(xí)了一下在wxpython中啟用線程的方法,將GUI和功能的執(zhí)行分開(kāi),果然程序運(yùn)行起來(lái)杠杠滴。因?yàn)槲夷莻€(gè)軟件的代碼暫時(shí)不能公開(kāi),這里專門(mén)寫(xiě)個(gè)小程序,作為今天的筆記吧
    2014-08-08
  • Python 如何實(shí)時(shí)向文件寫(xiě)入數(shù)據(jù)(附代碼)

    Python 如何實(shí)時(shí)向文件寫(xiě)入數(shù)據(jù)(附代碼)

    這篇文章主要介紹了Python 如何實(shí)時(shí)向文件寫(xiě)入數(shù)據(jù)(附代碼),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論

海伦市| 平乡县| 旬邑县| 利川市| 江源县| 中方县| 江口县| 察隅县| 孝义市| 嘉善县| 昆明市| 宣汉县| 盘锦市| 寿阳县| 辽阳市| 读书| 登封市| 佛学| 杂多县| 拉孜县| 深圳市| 遂溪县| 广东省| 敦化市| 阿城市| 三都| 南宫市| 洞头县| 卢龙县| 策勒县| 冷水江市| 若尔盖县| 邹平县| 鹿泉市| 壶关县| 瓮安县| 抚松县| 西安市| 萝北县| 五大连池市| 无极县|