[英]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.