繁体   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