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_name
和set_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中一个强大而深刻的区别).如果你坚持执行lambda
s,你会遇到许多这样的情况并学习解决方法(通常有一个,但并非总是如此),例如:在这种情况下:
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编译器只会对名称进行修改以获取合适的标识符,而不是字符串文字.
归档时间: |
|
查看次数: |
10953 次 |
最近记录: |