我想知道是否有可能有一个属性设置器也返回一个值。下面的代码试图从表面上解释这个问题。
基本上,我需要为一个对象设置一个属性,但在我需要检查它是否唯一之前。我想知道是否有一种方法可以直接将唯一的名称返回给用户,而不需要在之后查询对象的新名称。
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")Edit:这是一个伪代码,我忘记了将值实际传递给内部函数。是我的错。
发布于 2013-05-18 02:45:28
setter当然可以返回值。
但是这样做并不是很有用,因为setter通常用在赋值语句中--如您的示例所示。
问题是,在Python中,赋值不是表达式,而是语句。它没有可以使用的值,并且不能将其嵌入到另一条语句中。因此,没有办法写出你想要写的行。
相反,您可以显式调用setter…但在这种情况下,将其作为常规方法而不是属性设置器编写要清楚得多。
在你的例子中,我认为一个常规的方法正是你想要的。您完全忽略了传递给setter的值。这会让你代码的读者感到困惑(包括6个月后的你)。它根本不是一个真正的setter,它是一个创建唯一名称的函数。那么,为什么不这样说呢?
def CreateUniqueName(self):
UniqueName = DBGetUniqueName(self._ID)
return DBSetName(UniqueName)(值得注意的是,返回参数的DBSetName本身并不是Pythonic式的…)
如果你想知道为什么Python是这样工作的,请参阅官方常见问题解答中的Why can't I use an assignment in an expression?。
更广泛地说,表达式-语句的区别,再加上相关的特性,如变异方法(例如,list.sort)返回None而不是self,导致了一种更简单、更正规的语言。当然,这是有代价的,因为这会导致语言变得不那么流利。这是一个明显的权衡,Python几乎是您所能得到的最大限度的折衷。(与JavaScript相比,它是您所能得到的最极端的东西。)但大多数喜爱Python的人认为它做了正确的权衡。
发布于 2020-10-13 01:29:50
我从一个类似的问题开始,但我只需要从setter获取“通用”信息,以便自动化GUI创建;GUI代码查看属性列表,找到具有setter的属性,然后创建输入字段。然而,一些输入是字符串,另一些是浮点型等等,GUI代码生成适当的输入字段。我知道这是一个乱七八糟的东西,但我将该信息放在了getter的文档字符串中。
我意识到这不是你问题的答案,但可能会对像我这样的人有所帮助!
class Dog():
def __init__(self):
self._name = None
return
@property
def name(self):
"""Doggos are the best!"""
return self._name
@name.setter
def name(self, n):
self._name = n
return
def main():
terrier = Dog()
terrier.name = "Rover"
print("Dog's name is ", terrier.name)
print(type(terrier).name.__doc__)
# also works with...
print(getattr(type(terrier), 'name').__doc__)
return
if __name__ == '__main__':
main()发布于 2021-12-23 14:07:24
使用Python3.8或更高版本:
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)
Myinstance.Name = (Uniquename := Myinstance.Name) # Python >= 3.8https://stackoverflow.com/questions/16615866
复制相似问题