【问题标题】:Why use @property decorator when I can use a normal method getter? [duplicate]当我可以使用普通方法获取器时,为什么要使用 @property 装饰器? [复制]
【发布时间】:2021-01-16 16:40:50
【问题描述】:
class Employee:

    def __init__(self, name):
        self.name = name

    def getName(self):
        return self.name

    @property
    def getNameAgain(self):
        return self.name


person = Employee("John")
print(person.getName())  #John <--(calling method)
print(person.name)  #John <--(using @property)

所以我使用 getName() 得到了相同的结果,那么为什么我们在 getNameAgain() 中使用 @property 装饰器呢?我可以知道使用什么更好/更可取吗?提前谢谢!

【问题讨论】:

  • 既然可以使用属性,为什么还要使用get方法?顺便说一句,您的 print(person.name) 没有使用属性。它只是直接访问属性。
  • 注意,理解这一点很重要,如果您的 getter/setter 所做的一切都是nothing,那么您将只使用常规属性,即@987654323 @ 然后直接使用my_instance.name。如果,稍后您想要更改获取/设置的行为,那么您可以进行封装,而无需编写 getter 和 setter 的样板。换句话说,关键是在你的例子中,在 Python 中,你不会使用任何一个

标签: python oop properties decorator


【解决方案1】:

关键区别在于属性或方法的用户如何感知访问。

它们看起来确实不同:

class Foo:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    @property
    def name(self):
        return self._name


f = Foo('bar')
print(f.name)
print(f.get_name())

使用参数调用方法(如果没有,则使用空括号),而不使用属性。

此外,对于属性,可以期望能够为其分配值,而对于方法,您将寻找一个单独的 setter:

    @name.setter
    def name(self, value):
        self._name = value

    def set_name(self, value):
        self._name = value


f.name = 'baz'
f.set_name('baz')

同样,对于属性,语法是明确的,对于 setter,您可能想知道附加参数。

此外,如果您只需要一个属性,为什么要使用单独的 setter 和 getter 并键入更多的括号?毕竟,这是 Python,而不是 Java。

那么你什么时候会使用单独的 setter 和 getter 方法而不是属性?如果这些方面是你想要的。 IE。在设置值或检索值时需要额外的修饰符,例如encoding.

顺便说一句:我重命名了您的方法和属性以更符合标准 Python 命名约定。由于首先使用属性的主要原因是符合用户期望(库函数的用户,当然不是软件的用户),因此在命名时也这样做是有意义的。因此,get_name 而不是 getName._name 用于隐藏值而不是 .name 这表明用户可以直接操作该值(这很好,如果这是预期的)。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2018-04-04
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2021-03-12
    • 2011-01-02
    相关资源
    最近更新 更多