Python 使用lambda getter和setter创建属性
我有这样的想法:Python 使用lambda getter和setter创建属性,python,lambda,properties,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 =
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)
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))
我是否可以使用lambda函数替换get_name
和set_name
我试过这个:
name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))
但编译器不喜欢我的setter函数。您的问题是lambda的主体必须是一个表达式,赋值必须是一个语句(这在Python中是一个强大而深刻的区别)。如果您坚持执行
lambda
s,您将遇到许多此类情况,并了解解决方法(通常有一种,但并不总是),例如,在这种情况下:
name = property(lambda self: self.__name,
lambda self, value: setattr(self,
'_X__name',
self.process_value(value)))
i、 e.使用内置的setattr
(这是一个函数,因此在lambda
的主体中是可接受的),而不是赋值(这是一个语句,因此在lambda
的主体中是不可接受的)
您还需要手动执行双下划线属性的名称篡改(将
\uuuu name
更改为\ux\uu name
,因为您在X类中),其中属性名称以引号字符串形式显示,因为它必须在setattr
中,因为Pyhon编译器仅对合适的标识符进行名称篡改,不适用于字符串文本。如果您要扩展列表
,也可以使用\uuuuuu setitem\uuuu
,如下所示:
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)
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))
我还有一个问题。setattr仅适用于“\u name”而不适用于“\u name”。啊,是的,您需要手动执行损坏操作,因为它是一个带引号的字符串——让我进行相应的编辑!似乎您正试图使属性定义更加模糊。用lambdas替换简单函数有什么意义?