簡體   English   中英

python將內置屬性函數分配給列表元素

[英]python assign build-in property function to list element

我不明白為什么下面的代碼給出兩個不同的輸出

class foo(object):

       def myget(self):
          return 3

       goo=property(myget)

       hh1=[1,2,3]
       hh1[0]=property(myget)

       def hh(self):
         print self.goo
         print self.hh1[0]
ff=foo()
ff.hh()       

輸出:

 3
 <property object at 0x292a998>

謝謝

property對象是描述符 描述符僅在綁定到類時才具有特殊功能。 否則,它們的行為與任何其他類完全相同。 當將該屬性放在列表中時,它沒有綁定到該類,因此會丟失其特殊屬性。


例如,讓我們看一下用純python作為描述符編寫property的實現:

class Property(object):
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError, "unreadable attribute"
        return self.fget(obj)

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError, "can't set attribute"
        self.fset(obj, value)

    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError, "can't delete attribute"
        self.fdel(obj)

注意__get____set____delete__的第二個參數是obj嗎? obj是描述符綁定到的類的實例(如果有助於說明問題,它將作為self傳遞給方法)。 為了使整個shebang正常工作,必須將描述符綁定到一個類, __get__可以調用__get__並將obj傳遞給它。 如果描述符未綁定到類,則不會調用__get__ ,並且您的描述符類將變為具有兩個永遠不會被調用的魔術方法的另一個類(除非您顯式調用它們)。

在執行以下操作時,也許更具體一點:

a = instance.my_descriptor

這將調用my_descriptor.__get__(instance)並相應地:

instance.my_descriptor = a

調用my_descriptor.__set__(instance,a)

但是,如果my_descriptor未綁定到類,則它的行為就像解釋您所看到的內容的任何其他類(對象)一樣。

我認為這可能與字典有關。 描述符(屬性)僅響應object或class dict中的屬性。 hh1 []和goo都在foo中。 字典 但是hh1 [0]無效,因此描述符在hh1 [0]中不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM