首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python setter也返回值

Python setter也返回值
EN

Stack Overflow用户
提问于 2013-05-18 02:42:21
回答 3查看 3.9K关注 0票数 2

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

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

代码语言:javascript
复制
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:这是一个伪代码,我忘记了将值实际传递给内部函数。是我的错。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-18 02:45:28

setter当然可以返回值。

但是这样做并不是很有用,因为setter通常用在赋值语句中--如您的示例所示。

问题是,在Python中,赋值不是表达式,而是语句。它没有可以使用的值,并且不能将其嵌入到另一条语句中。因此,没有办法写出你想要写的行。

相反,您可以显式调用setter…但在这种情况下,将其作为常规方法而不是属性设置器编写要清楚得多。

在你的例子中,我认为一个常规的方法正是你想要的。您完全忽略了传递给setter的值。这会让你代码的读者感到困惑(包括6个月后的你)。它根本不是一个真正的setter,它是一个创建唯一名称的函数。那么,为什么不这样说呢?

代码语言:javascript
复制
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的人认为它做了正确的权衡。

票数 6
EN

Stack Overflow用户

发布于 2020-10-13 01:29:50

我从一个类似的问题开始,但我只需要从setter获取“通用”信息,以便自动化GUI创建;GUI代码查看属性列表,找到具有setter的属性,然后创建输入字段。然而,一些输入是字符串,另一些是浮点型等等,GUI代码生成适当的输入字段。我知道这是一个乱七八糟的东西,但我将该信息放在了getter的文档字符串中。

我意识到这不是你问题的答案,但可能会对像我这样的人有所帮助!

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2021-12-23 14:07:24

使用Python3.8或更高版本:

代码语言:javascript
复制
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.8
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16615866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档