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

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

用__getattr__和相關(guān)的封裝

用__getattr__和相關(guān)的封裝

狐的傳說 2021-03-03 17:14:48
我試圖封裝一個(gè)對象而不更改其默認(rèn)行為,問題是,當(dāng)我可以訪問它已經(jīng)構(gòu)造的對象時(shí)。因此,我的想法是使用繼承和使用__getattr__,__setattr__,__getitem__,和__setitem__和代表對封裝的對象,除了場我定義自己。class Request(HttpRequest):    def __init__(self, request, *args, **kwargs):        self._original_request = request        super(Request, self).__init__(*args, **kwargs)    def __getattr__(self, name):        return getattr(self._original_request, name)    def __setattr__(self, name, value):        if name == '_original_request':            super(Request, self).__setattr__(name, value)        else:            self._original_request.__setattr__(name, value)    def __getitem__(self, key):        return self._original_request[key]    def __setitem__(self, key, value):        self._original_request[key] = value如果我通過原始對象,一切都很好。如果不這樣做,我會(huì)得到host = self.META['SERVER_NAME']KeyError: u'SERVER_NAME'我想念什么嗎?我的課程難道不應(yīng)該完全像它所封裝的那樣嗎?
查看完整描述

2 回答

?
肥皂起泡泡

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

問題出在行:


    super(Request, self).__init__(*args, **kwargs)

這將導(dǎo)致在您的實(shí)例上調(diào)用該類的__init__方法,這是沒有意義的。因此,只需擺脫那條線。HttpRequestRequest


另外,我不明白為什么首先要繼承子類。由于python具有鴨子類型,并且您已經(jīng)完全包裝了內(nèi)部對象,所以為什么不這樣做:


class Request(object):

    def __init__(self, request, *args, **kwargs):

        self._original_request = request


    def __getattr__(self, name):

        return getattr(self._original_request, name)


    def __setattr__(self, name, value):

        if name == '_original_request':

            super(Request, self).__setattr__(name, value)

        else:

            self._original_request.__setattr__(name, value)


    def __getitem__(self, key):

        return self._original_request[key]


    def __setitem__(self, key, value):

        self._original_request[key] = value


查看完整回答
反對 回復(fù) 2021-03-31
?
牧羊人nacy

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

堆棧跟蹤顯示了問題所在:代碼試圖將屬性設(shè)置為self._original_request而不是self.__dict__。

閱讀Python文檔以定制屬性訪問。


查看完整回答
反對 回復(fù) 2021-03-31
  • 2 回答
  • 0 關(guān)注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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