簡體   English   中英

python中的C#樣式屬性

[英]C# style properties in python

我正在尋找一種使用嵌套的get / set定義在Python中定義類似於C#的屬性的方法。
這是我得到了多遠:

#### definition ####    

def Prop(fcn):
    f = fcn()
    return property(f['get'], f['set'])


#### test ####

class Example(object):

    @Prop
    def myattr():

        def get(self):
            return self._value

        def set(self, value):
            self._value = value

        return locals()  #  <- how to get rid of this?

e = Example()
e.myattr = 'somevalue' 
print e.myattr


問題在於,它仍然需要定義才能“返回locals()”。
有辦法擺脫它嗎?
也許有一個嵌套的裝飾器?

您可以return get, set (一種更為優雅的方法)並使您的Prop成為

def Prop(fcn):
    g, s = fcn()
    return property(g, s)

但是,沒有一種干凈的方法可以在經過修飾的函數中不需要任何 return語句。 具有內部def語句的函數,就像具有內部賦值的函數一樣,直到被調用時才真正執行這些語句-實際上,找不到在該賦值和def所要構建和綁定的對象和名稱。

一旦它稱為,說名字和對象是局部的作用-所以,他們離開,除非他們的外部引用存在......和真的沒有更優雅的方式,以確保當地的名稱存在,這樣的外部引用除了return荷蘭國際集團他們以某種形式。

問題來自於堅持要裝飾一個功能對象(通過設計,該對象非常保留其本地名稱)。 如果您同意使用正確的關鍵字而不是def修飾的東西,那么一切都會好起來的-正確的關鍵字是class (注意,為此需要Python 2.6或更高版本)...:

def Prop(cls):
    f = cls.__dict__
    return property(f['get'], f['set'])


#### test ####

class Example(object):

    @Prop
    class myattr():

        def get(self):
            print 'getting', self._value
            return self._value

        def set(self, value):
            print 'setting', value
            self._value = value


e = Example()
e.myattr = 'somevalue' 
print e.myattr

與函數相比,類的秘密要少得多,因此裝飾器可以輕松完成您想要的工作。 注意這些微小的變化: __dict__訪問要修飾的類的dict,要修飾的對象中的s/def/class/以及刪除您不喜歡的return語句。

暫無
暫無

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

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