3 回答

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。

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__])
添加回答
舉報(bào)