创建使用lambda getter和setter属性(Create properties using

2019-07-31 07:44发布

我有这样的事情:

class X():
    def __init__(self):
        self.__name = None

    def _process_value(self, value):
        # do something
        pass

    def get_name(self):
        return self.__name

    def set_name(self, value):
        self.__name = self._process_value(value)

    name = property(get_name, set_name)

我能代替get_nameset_name使用lambda函数?

我已经试过这样:

name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))

但是编译器不喜欢我的setter函数。

Answer 1:

你的问题是,拉姆达的身体必须是一个表达式和赋值是一个语句(Python中的强势,深区别)。 如果硬要犯下lambda是你会遇到很多这样的情况,学会变通方法(通常有一个,但并不总是),例如,在这种情况下:

name = property(lambda self: self.__name, 
                lambda self, value: setattr(self, 
                                            '_X__name',
                                            self.process_value(value)))

即使用内置在setattr (这是在一个功能,因此可接受的lambda的身体),而不是分配(这是在一个语句,因而不能接受的lambda的身体)。

编辑 :您还需要进行名称重整手动双下划线属性(改变__name_X__name为你在课堂X是),其中属性名是作为一个引用的字符串,因为它必须在SETATTR,如在Pyhon编译器只这个名字有问题重整合适的标识符,而不是字符串文字。



Answer 2:

如果要扩展一个list ,你也可以使用__setitem__ ,就像这样:

class Position(list):
    def __init__(self,x=0, y=0, z=0):
        super(Position, self).__init__((x,y,z))

    x = property(lambda self: self[0],
                 lambda self,value: self.__setitem__(0, value))
    y = property(lambda self: self[1],
                 lambda self,value: self.__setitem__(1, value))
    z = property(lambda self: self[2],
                 lambda self,value: self.__setitem__(2, value))


文章来源: Create properties using lambda getter and setter