【问题标题】:For what purpose does it make sense to give a property setter method a return value?为属性设置器方法提供返回值的目的是什么?
【发布时间】:2020-08-22 23:34:27
【问题描述】:

在什么情况下给类属性设置方法一个返回值是有意义的,如下面的代码 sn-p 所示?

class Person():
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    @property # getter method
    def full_name(self):
        return ' '.join([self.first_name, self.last_name])

    @full_name.setter # setter method
    def full_name(self, name):
        self.first_name, self.last_name = name.split()
        return 'When and how should I use this return value?'

【问题讨论】:

  • 没有,真的。 setter 是由赋值语句调用的,它根本没有值。

标签: python python-3.x properties setter


【解决方案1】:

虽然设置器可以返回一个值,但它意味着在该返回值将被忽略的上下文中调用。像

p = Person()
p.full_name = "John Doe"

分配将由Person.full_name.__set__(p, "John Doe") 执行。如果您查看描述符 how-to,有一个 section 演示了如何在纯 Python 中定义 property 类。这个问题最重要的是__set__将如何实现:

def __set__(self, obj, value):
    if self.fset is None:
        raise AttributeError("can't set attribute")
    self.fset(obj, value)

self.fset 是你的二传手。注意它的返回值被忽略了。

【讨论】:

    【解决方案2】:

    如果您想获取值,请使用get 方法。 如果要设置值,请使用 set 方法的编程语言规则。

    如果你这样做,你就违反了 POO 封装的规则和单一责任原则。

    如果您想了解更多信息,可以访问此wikipedia article about single responsibility principle。 单身责任是 SOLID 设计模式的一部分,对于 POO 来说,这是最常用的模式之一。 Here is some reference.

    【讨论】:

    • Personperson 都没有 get 方法。你能举个例子吗?
    • 嗯,那是因为您使用的是 python,setter 是以隐式方式调用的。如果你使用像 java、c#、php、C++、scala 这样的语言,getter 是一种常见的做法。就像在 java 中一样,它被称为 java bean(getter 和 setter)。
    猜你喜欢
    • 2019-06-02
    • 2023-03-10
    • 2012-05-31
    • 1970-01-01
    • 2021-08-13
    • 2016-10-25
    • 2013-03-17
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多