当我可以使用普通的方法 getter 时,为什么还要使用 @property 装饰器?

She*_*hee 7 python oop properties decorator

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)
Run Code Online (Sandbox Code Playgroud)

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

Gri*_*mar 12

主要区别在于属性或方法的用户如何看待访问。

它们看起来确实不同:

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())
Run Code Online (Sandbox Code Playgroud)

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

此外,对于属性,可能期望能够为其赋值,而对于方法,您需要寻找一个单独的设置器:

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

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


f.name = 'baz'
f.set_name('baz')
Run Code Online (Sandbox Code Playgroud)

同样,对于属性,语法是明确的,对于设置器,您可能想知道其他参数。

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

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

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