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