我有这样的事情:
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_name
和set_name
使用lambda函数?
我已经试过这样:
name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))
但是编译器不喜欢我的setter函数。
你的问题是,拉姆达的身体必须是一个表达式和赋值是一个语句(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编译器只这个名字有问题重整合适的标识符,而不是字符串文字。
如果要扩展一个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))