小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python3元類的調(diào)用順序

 印度阿三17 2019-06-07

在嘗試?yán)斫庠悇?chuàng)建類實(shí)例的順序時(shí),我感到困惑.根據(jù)該圖(source),enter image description here

我鍵入以下代碼進(jìn)行驗(yàn)證.

class Meta(type):
    def __call__(self):
        print("Meta __call__")
        super(Meta, self).__call__()

    def __new__(mcs, name, bases, attrs, **kwargs):
        print("Meta __new__")
        return super().__new__(mcs, name, bases, kwargs)

    def __prepare__(msc, name, **kwargs):
        print("Meta __prepare__")
        return {}

class SubMeta(Meta):
    def __call__(self):
        print("SubMeta __call__!")
        super().__call__()

    def __new__(mcs, name, bases, attrs, **kwargs):
        print("SubMeta __new__")
        return super().__new__(mcs, name, bases, kwargs)

    def __prepare__(msc, name, **kwargs):
        print("SubMeta __prepare__")
        return Meta.__prepare__(name, kwargs)

class B(metaclass = SubMeta):
    pass

b = B()

但是,結(jié)果似乎不是這樣的.

SubMeta __prepare__
Meta __prepare__
SubMeta __new__
Meta __new__
SubMeta __call__!
Meta __call__

任何幫助將不勝感激.

解決方法:

盡管@ torek的長篇答案,以及關(guān)于課堂創(chuàng)作的許多其他細(xì)節(jié),你在這個(gè)問題上匯集的內(nèi)容大多是正確的.

你的代碼中唯一錯(cuò)誤的就是讓你感到困惑的是你調(diào)用Meta的te類本身就是SubMeta的元類,而不是它的父元素.

只需將Submeta聲明更改為:

class SubMeta(type, metaclass=Meta):
    ...

(也不需要它繼承“Meta” – 它只能從類型派生.除此之外,我想要定制類型.__ call__,這對于創(chuàng)建類的實(shí)例同時(shí)是有用的(當(dāng)調(diào)用SubMeta .__ call__時(shí),你的類本身(調(diào)用Meta .__ call__))

這是我剛在終端輸入的另一個(gè)較短的例子.很抱歉命名不一致,并且不太完整 – 但它顯示了要點(diǎn):

class M(type):
    def __call__(mmcls, *args, **kwargs):
        print("M's call", args, kwargs)
        return super().__call__(*args, **kwargs)

class MM(type, metaclass=M):
    def __prepare__(cls, *args, **kw):
        print("MM Prepare")
        return {}
    def __new__(mcls, *args, **kw):
        print("MM __new__")
        return super().__new__(mcls, *args, **kw)

class klass(metaclass=MM):
    pass

在處理klass體時(shí),Python輸出是:

MM Prepare
M's call ('klass', (), {'__module__': '__main__', '__qualname__': 'klass'}) {}
MM __new__

此外

正如您所看到的,使用元元類,可以自定義元類__init__和__new__的調(diào)用順序和參數(shù),但仍然存在無法從純Python代碼自定義的步驟,并且需要對API的本機(jī)調(diào)用(以及可能的原始對象結(jié)構(gòu)操作) – 即:

>無法控制對__prepare__的調(diào)用
>無法控制對創(chuàng)建的類的__init_subclass__的調(diào)用
>可以控制何時(shí)調(diào)用描述符’__set_name__

最后兩個(gè)項(xiàng)目發(fā)生在meta-meta的__call__返回之后,并且在將流程恢復(fù)到類模塊所在的模塊之前.

來源:http://www./content-1-228701.html

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多