Python setter也返回值

Mac*_*Mac 1 python setter decorator getter-setter python-3.x

我想知道是否可以有一个属性设置器来返回一个值。下面的代码试图从表面上解释问题。

基本上,我需要为对象设置一个属性,但是在我需要检查它是否唯一之前。我想知道是否有一种方法可以直接将唯一名称返回给用户,而无需在此后查询对象的新名称。

class MyClass(object):
    def __init__(self,ID):
        self._ID = ID
    @property
    def Name(self):
        return DBGetName(self._ID)

    @Name.setter
    def Name(self, value):
        UniqueName = DBGetUniqueName(self._ID,value)
        return DBSetName(UniqueName)

Myinstance = MyClass(SomeNumber)
#What I do now
Myinstance.Name = "NewName"
Uniquename = Myinstance.Name

#What I was wondering if possible. Line below is syntactically invalid, but shows the idea.
Name = (Myinstance.Name = "NewName")
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个伪代码,我忘了实际将值传递给内部函数。我的错。

aba*_*ert 5

设置员当然可以返回值。

但是这样做不是很有用,因为在赋值语句中通常使用setter方法(例如您的示例)。

问题是在Python中,赋值不是表达式,而是语句。它没有可以使用的值,也不能将其嵌入另一个语句中。因此,没有办法编写您要编写的行。

您可以改为显式地调用setter…,但是在这种情况下,将其作为常规方法而不是属性setter编写起来要清晰得多。


在您的情况下,我认为常规方法正是您想要的。您完全忽略了传递给设置器的值。这会使您的代码读者(包括6个月内的您)感到困惑。它根本不是一个二传手,它是一个创建唯一名称的函数。那么,为什么不这样称呼呢?

def CreateUniqueName(self):
    UniqueName = DBGetUniqueName(self._ID)
    return DBSetName(UniqueName)
Run Code Online (Sandbox Code Playgroud)

(值得注意的是,DBSetName返回其参数本身并不是Python风格的…)


如果您想知道Python 为什么以这种方式工作,请参阅为什么不能在表达式中使用赋值?从官方常见问题解答中。

更一般而言,表达式-语句的区别以及诸如的变异方法(例如list.sort)的None替代返回(而不是)的相关特征共同self导致了一种更简单,更规范的语言。当然,这是有代价的,因为这会导致语言的流利性大大降低。有一个明显的权衡,Python尽可能地接近极限。(与JavaScript相比,这是可以达到的另一种极端。)但是,大多数喜欢Python的人都认为它是正确的折衷方案。