如果 属性 已经在 python 中工作,为什么我们需要属性的 getter?

Why do we need propertie's getter if property already does it's job in python?

想象两个相似的 类。第一个有 属性 和 getter,第二个只有 属性。如果我们不明确地写 getter,属性 已经在做 getter 的工作。 那么为什么我们需要定义getter?


class Test:

    def __init__(self):
        self._prop = 0

    @property
    def prop(self):
        print("property accessed")
        return self._prop

    @prop.getter
    def prop(self):
        print("getter accessed")
        return self._prop


class Test2:

    def __init__(self):
        self._prop = 0

    @property
    def prop(self):
        print("property accessed")
        return self._prop


if __name__ == "__main__":
    t = Test() 
    print(t.prop)
    et = Test2()
    print(et.prop)

# output
# getter accessed
# 0
# property accessed
# 0

property class 提供了两种配置 getter、setter 和删除方法的方法。

  1. 创建 属性 时将函数作为参数传递。
  2. 使用 属性 的 gettersetterdeleter 方法,每个方法 returns 一个 new 属性 与相应的 fgetfsetfdel 覆盖。

例如给定三个函数

def get_value(self):
    ...

def set_value(self, value):
    ...

def delete_value(self):
    ...

你写一个

p1 = property(get_value, set_value, delete_value)

# All arguments are optional
p2 = property()
p2 = p2.getter(get_value)
p2 = p2.setter(set_value)
p2 = p2.deleter(set_value)

propertyproperty.getterproperty.setterproperty.deleter 都是为了允许它们用作装饰器而设计的。

p2 = property()

@p2.getter
def p2(self):  # get_value
   ...

@p2.setter
def p2(self, value):  # set_value
    ...

@p2.deleter
def p2(self):  # del_value
    ...

在普通用法中,采用混合方法:创建 属性 并用 getter 一步初始化 (第一个参数是getter 来支持这种最常见的只读用例 属性),一个可选的 setter 和必要时提供的删除器。

@property
def p2(self):  # get_value
    ...

因此,property.getter 的显式使用很少见,但可用。虽然可以随时调用所有这三种方法来改变现有 属性 的行为,但我认为除了 属性 的初始配置之外,我什至没有看到它们被使用过。