亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 22507 | 回復(fù): 2
打印 上一主題 下一主題

python描述符問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2020-05-18 17:54 |只看該作者 |倒序?yàn)g覽
# 此程序用于使用魔方方法訪問、更改、刪除實(shí)例屬性
class MyProperty:
    def __init__(self, fget=None, fset=None, fdel=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel

    def __get__(self, instance, owner):
        name=self.fget
        print('name=', name)
        return name(instance)

    def __set__(self, instance, value):
        self.fset(instance, value)

    def __delete__(self, instance):
        self.fdel(instance)


class C:
    def __init__(self):
        self._x = None

    def getX(self):
        return self._x

    def setX(self, value):
        self._x = value

    def delX(self):
        del self._x

    # 此為描述符將類的實(shí)例賦值給另一個(gè)類的變量
    x = MyProperty(getX, setX, delX)
疑問1:在__get__(self, instance, owner)方法中,返回的是self.fget(instance),也就是用‘方法名(實(shí)例名)’的方式訪問C的實(shí)例方法,但訪問實(shí)例方法應(yīng)該用‘實(shí)例名.方法名()'的方式訪問才對(duì),把self.fget(instance)改為instance.(self.fget())運(yùn)行會(huì)報(bào)錯(cuò),為什么?
疑問2::把__get__(self, instance, owner)方法中的self.fget(instance)改為instance.getX()就能正常運(yùn)行,而用instance.self.fget()就會(huì)出錯(cuò),但self.fget = getX,二者應(yīng)該是等價(jià)的啊,應(yīng)該都能運(yùn)行才對(duì)。

論壇徽章:
8
2016科比退役紀(jì)念章
日期:2018-10-24 08:24:0115-16賽季CBA聯(lián)賽之北控
日期:2019-03-12 14:34:562016科比退役紀(jì)念章
日期:2019-04-01 10:33:0915-16賽季CBA聯(lián)賽之山東
日期:2019-04-17 12:46:3215-16賽季CBA聯(lián)賽之廣夏
日期:2019-05-09 16:40:4015-16賽季CBA聯(lián)賽之廣夏
日期:2019-10-10 15:33:4015-16賽季CBA聯(lián)賽之遼寧
日期:2019-10-15 08:37:0615-16賽季CBA聯(lián)賽之北控
日期:2021-03-30 15:53:34
2 [報(bào)告]
發(fā)表于 2020-05-25 16:31 |只看該作者
樓主的代碼應(yīng)該是用 描述符類來模擬內(nèi)建的 property 裝飾器。
我感覺描述符類 對(duì)python初學(xué)者 是一個(gè)小小的難點(diǎn),我自己可能也理解的不夠深入,還是要多翻書,多實(shí)踐。

你這兩個(gè)問題 應(yīng)該就是一個(gè)問題。
你說  "實(shí)例方法應(yīng)該用‘實(shí)例名.方法名()'的方式訪問才對(duì)",  是的  所以你第二個(gè)問題中的
  1. instance.getX()
復(fù)制代碼
就正常。

  1. instance.(self.fget())
復(fù)制代碼
這個(gè)肯定報(bào)的是語法錯(cuò)誤了。
instance 就是C的實(shí)例,又是點(diǎn),又是括號(hào),你到底是要調(diào)用屬性還是方法呢?沒有這種語法。所以報(bào)語法錯(cuò)誤。
問題2中
  1. instance.self.fget()
復(fù)制代碼

就是上面的寫法沒有括號(hào),這樣寫法的意思 是先調(diào)用instance就是C實(shí)例的self屬性,顯然C沒有名字叫"self"的屬性,所以會(huì)報(bào)AttributeError。
  1. self.fget = getX
復(fù)制代碼
大概可以理解為 描述類實(shí)例的屬性指向了一個(gè)函數(shù)的引用。這不等于任何情況下就能 直接的替換!  這里你把描述符的 self.fget()跟在了另一個(gè)類C的實(shí)例instance的后面 顯然是錯(cuò)誤的。

論壇徽章:
8
2016科比退役紀(jì)念章
日期:2018-10-24 08:24:0115-16賽季CBA聯(lián)賽之北控
日期:2019-03-12 14:34:562016科比退役紀(jì)念章
日期:2019-04-01 10:33:0915-16賽季CBA聯(lián)賽之山東
日期:2019-04-17 12:46:3215-16賽季CBA聯(lián)賽之廣夏
日期:2019-05-09 16:40:4015-16賽季CBA聯(lián)賽之廣夏
日期:2019-10-10 15:33:4015-16賽季CBA聯(lián)賽之遼寧
日期:2019-10-15 08:37:0615-16賽季CBA聯(lián)賽之北控
日期:2021-03-30 15:53:34
3 [報(bào)告]
發(fā)表于 2020-05-25 16:33 |只看該作者
本帖最后由 cfwyy 于 2020-05-26 07:57 編輯

論壇的回復(fù)有時(shí)候有問題,多回了一次。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP