使用lambda getter和setter创建属性

tef*_*ozi 6 python lambda properties

我有这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

我可以替换get_nameset_name使用lambda函数吗?

我试过这个:

name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lli 20

你的问题是lambda的主体必须是一个表达式,赋值是一个声明(Python中一个强大而深刻的区别).如果你坚持执行lambdas,你会遇到许多这样的情况并学习解决方法(通常有一个,但并非总是如此),例如:在这种情况下:

name = property(lambda self: self.__name, 
                lambda self, value: setattr(self, 
                                            '_X__name',
                                            self.process_value(value)))
Run Code Online (Sandbox Code Playgroud)

即使用内置setattr(这是一种功能,因此在lambda身体中可接受)而不是分配(这是一种陈述,因此在lambda身体中是不可接受的).

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