Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用lambda getter和setter创建属性_Python_Lambda_Properties - Fatal编程技术网

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替换简单函数有什么意义?