【发布时间】:2013-05-13 00:35:24
【问题描述】:
我想知道是否有可能让一个属性设置器也返回一个值。下面的代码试图从表面上解释问题。
基本上我需要为一个对象设置一个属性,但在我需要检查它是否唯一之前。我想知道是否有办法直接将唯一名称返回给用户,而无需事后查询对象的新名称。
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")
编辑: 这是一个伪代码,我忘记将值实际传递给内部函数。我的错。
【问题讨论】:
-
我对此有点困惑。看起来 setter 完全忽略了您传递给它的值。一个接受
MyInstance.Name = "NewName"并将名称设置为"NewName-071839"的设置器我可以理解,但这会让我感到困惑(即使在 JavaScript 或 C# 或其他允许它的语言中)。 -
好吧,
Name = Myinstance.Name = "NewName"在语法上是有效的,但是 setter 的返回值将被忽略,它只会将Name设置为"NewName"。 -
@Aya:好点。如果没有括号,这将是一个链式赋值语句,这意味着“将此值分配给所有链式在一起的名称”。在非常简单的情况下,这与 C/JS/etc 的作用相同。 “将此值分配给姓氏,然后将该分配的结果分配给它之前的那个,......”,但在这种情况下它没有帮助。
-
@abarnert 当然。不过,如果您有 C++ 背景,并且使用过
operator=,您可能希望能够在 Python 中做类似的事情。 TBH,我很高兴您不能在 Python 中使用赋值作为表达式 - 我有时仍将if foo == 1错误输入为if foo = 1,尤其是当我在 Python 和 SQL 编码之间切换时,Python 发现这很好对我来说那个特殊的错误,因为它很容易被错过。 -
@Aya:另一个好点。链式赋值在两个可能让新手混淆的方式表面上类似于 C++,而不仅仅是 C 和 JS 的一种方式……无论如何,我也很高兴 Python 不允许赋值表达式,但它更多的是成为一整套功能的一部分,这些功能使几乎所有 Python 代码的结构都比几乎任何 JS 或 C++ 代码更具可读性。
标签: python python-3.x decorator setter getter-setter