第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python 3 中默認(rèn)的 ```__new__``` 是什么?

Python 3 中默認(rèn)的 ```__new__``` 是什么?

阿晨1998 2022-04-27 16:21:05
我相信我對(duì)應(yīng)該做什么有一定的了解__new__(創(chuàng)建一個(gè)類的實(shí)例,但不初始化它,這是 的工作__init__)。但是,我想了解 Python 3__new__默認(rèn)作為方法實(shí)現(xiàn)的內(nèi)容。我也覺(jué)得它c(diǎn)ls的一個(gè)參數(shù)有點(diǎn)令人困惑__new__,但__new__它是一個(gè)靜態(tài)方法而不是一個(gè)類方法(我從文檔中得到這個(gè))......現(xiàn)在它是如何作為它的第一個(gè)參數(shù)傳遞一個(gè)類型的?
查看完整描述

2 回答

?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

第一部分:__new__默認(rèn)情況下做什么?因?yàn)閺念^開(kāi)始創(chuàng)建對(duì)象是一項(xiàng)基本的、特定于實(shí)現(xiàn)的操作,所以定義object.__new__(與 定義的其余部分一樣)必然object是實(shí)現(xiàn)本身的一部分。這意味著您需要查看 CPython、PyPy、Cython 等的源代碼,以準(zhǔn)確了解在 Python 的任何特定實(shí)現(xiàn)中如何管理對(duì)象創(chuàng)建。通常,這都是無(wú)法從 Python 本身直接訪問(wèn)的低級(jí)簿記。


第二部分:如何__new__知道它得到了一個(gè)類參數(shù)?因?yàn)樗僭O(shè)它的第一個(gè)參數(shù)是一個(gè)類,如果調(diào)用者希望__new__正確工作,最好提供一個(gè)類!也就是說(shuō),沒(méi)有人真正明確地調(diào)用__new__過(guò),除了通過(guò)super覆蓋__new__,然后,您必須確保cls自己明確地傳遞:


def __new__(cls, *args, **kwargs):

    rv = super().__new__(cls, *args, **kwargs)  # Not super().__new__(*args, **kwargs)

Foo其余時(shí)間,您不是通過(guò)Foo.__new__(Foo, ...)直接調(diào)用,而是通過(guò)調(diào)用類型本身來(lái)創(chuàng)建類的實(shí)例: Foo(...). 這是管理的,因?yàn)?'s 元類的__call__方法Foo負(fù)責(zé)調(diào)用__new__你的。例如,您可以想象type.__call__大致定義為


# A regular instance method of type; we use cls instead of self to

# emphasize that an instance of a metaclass is a class

def __call__(cls, *args, **kwargs):

    rv = cls.__new__(cls, *args, **kwargs)  # Because __new__ is static!

    if isinstance(rv, cls):

        rv.__init__(*args, **kwargs)

    return rv

請(qǐng)注意,__init__只有在__new__實(shí)際返回__new__首先調(diào)用的類的實(shí)例時(shí)才會(huì)調(diào)用。


查看完整回答
反對(duì) 回復(fù) 2022-04-27
?
米琪卡哇伊

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊

根據(jù)我的理解,默認(rèn)實(shí)現(xiàn)__new__()是這樣的


class Default(object):

def __new__(cls, *args, **kwargs):

    print("In new")

    return super().__new__(cls,*args, **kwargs)


def __init__(self):

    print("In init default")


default = Default()

print(type(default))

輸出


In new

In init default

<class '__main__.Default'>

基于文檔 https://docs.python.org/3/reference/datamodel.html#object。新的


典型的實(shí)現(xiàn)通過(guò)使用 super() 調(diào)用超類的__new__()方法來(lái)創(chuàng)建類的新實(shí)例。new (cls[, ...]) 帶有適當(dāng)?shù)膮?shù),然后在返回之前根據(jù)需要修改新創(chuàng)建的實(shí)例。


該super().__new__()調(diào)用將創(chuàng)建實(shí)例并__init__()進(jìn)行初始化。


下面的代碼顯示了不正確的覆蓋__new__()


class InccorectOverride(object):


def __new__(cls, *args, **kwargs):

    pass


def __init__(self):

    print("In init InccorectOverride")


a = InccorectOverride()

print(type(a))

輸出


<class 'NoneType'>

由于__new__()不返回實(shí)例,因此輸出值為 NoneType


希望這能回答你的問(wèn)題


查看完整回答
反對(duì) 回復(fù) 2022-04-27
  • 2 回答
  • 0 關(guān)注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)