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

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

模塊上的__getattr__

模塊上的__getattr__

翻閱古今 2019-08-02 14:36:20
模塊上的__getattr__如何__getattr__在模塊上實(shí)現(xiàn)類的等價(jià)?例當(dāng)調(diào)用模塊靜態(tài)定義的屬性中不存在的函數(shù)時(shí),我希望在該模塊中創(chuàng)建一個(gè)類的實(shí)例,并在模塊上的屬性查找中使用與失敗相同的名稱調(diào)用其上的方法。class A(object):     def salutation(self, accusative):         print "hello", accusative# note this function is intentionally on the module, and not the class abovedef __getattr__(mod, name):     return getattr(A(), name)if __name__ == "__main__":     # i hope here to have my __getattr__ function above invoked, since     # salutation does not exist in the current namespace     salutation("world")這使:matt@stanley:~/Desktop$ python getattrmod.py  Traceback (most recent call last):   File "getattrmod.py", line 9, in <module>     salutation("world")NameError: name 'salutation' is not defined
查看完整描述

3 回答

?
天涯盡頭無(wú)女友

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

不久之前,Guido宣稱所有關(guān)于新式類的特殊方法查找都會(huì)繞過(guò)__getattr____getattribute__。Dunder方法曾經(jīng)工作的模塊-你可以,例如,使用一個(gè)模塊作為一個(gè)上下文管理器簡(jiǎn)單地通過(guò)定義__enter____exit__,這些技巧之前爆發(fā)。

最近一些歷史特征已經(jīng)卷土重來(lái),其中的模塊__getattr__,所以現(xiàn)在的黑客攻擊(一個(gè)模塊sys.modules在導(dǎo)入時(shí)替換為一個(gè)類)應(yīng)該不再需要了。

在Python 3.7+中,您只需使用一種顯而易見的方法。要自定義模塊上的屬性訪問(wèn)權(quán)限,請(qǐng)__getattr__在模塊級(jí)別定義一個(gè)函數(shù),該函數(shù)應(yīng)接受一個(gè)參數(shù)(屬性名稱),并返回計(jì)算值或引發(fā)AttributeError

# my_module.pydef __getattr__(name: str) -> Any:
    ...

這也允許掛鉤進(jìn)入“from”導(dǎo)入,即你可以為語(yǔ)句返回動(dòng)態(tài)生成的對(duì)象from my_module import whatever。

在相關(guān)的說(shuō)明中,與模塊getattr一起,您還可以__dir__在模塊級(jí)別定義一個(gè)函數(shù)來(lái)響應(yīng)dir(my_module)。有關(guān)詳細(xì)信息,請(qǐng)參閱PEP 562。


查看完整回答
反對(duì) 回復(fù) 2019-08-02
?
守著一只汪

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

這是一個(gè)hack,但你可以用一個(gè)類包裝模塊:

class Wrapper(object):
  def __init__(self, wrapped):
    self.wrapped = wrapped  def __getattr__(self, name):
    # Perform custom logic here
    try:
      return getattr(self.wrapped, name)
    except AttributeError:
      return 'default' # Some sensible defaultsys.modules[__name__] = Wrapper(sys.modules[__name__])


查看完整回答
反對(duì) 回復(fù) 2019-08-02
  • 3 回答
  • 0 關(guān)注
  • 621 瀏覽
慕課專欄
更多

添加回答

舉報(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)