如果 属性 已经在 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 和删除方法的方法。
- 创建 属性 时将函数作为参数传递。
- 使用 属性 的
getter
、setter
和 deleter
方法,每个方法 returns 一个 new 属性 与相应的 fget
、fset
或 fdel
覆盖。
例如给定三个函数
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)
property
、property.getter
、property.setter
和 property.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
的显式使用很少见,但可用。虽然可以随时调用所有这三种方法来改变现有 属性 的行为,但我认为除了 属性 的初始配置之外,我什至没有看到它们被使用过。
想象两个相似的 类。第一个有 属性 和 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 和删除方法的方法。
- 创建 属性 时将函数作为参数传递。
- 使用 属性 的
getter
、setter
和deleter
方法,每个方法 returns 一个 new 属性 与相应的fget
、fset
或fdel
覆盖。
例如给定三个函数
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)
property
、property.getter
、property.setter
和 property.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
的显式使用很少见,但可用。虽然可以随时调用所有这三种方法来改变现有 属性 的行为,但我认为除了 属性 的初始配置之外,我什至没有看到它们被使用过。