[英]Use of property's getter in python
我正在调查属性,无法理解getter的用法。
代码:
class A:
def __init__(self,p):
self._p = p
@property
def p(self):
return self._p
@p.setter
def p(self, value):
self._p = value
@p.getter
def p(self):
return self._p
所以,我做了以下
obj = A(10)
print(obj.p)
我得到以下输出:
10
因此,我认为@ p.getter被调用并返回_q的值。
但是,我尝试没有@ p.getter如下
class A:
def __init__(self,p):
self._p = p
@property
def p(self):
return self._p
@p.setter
def p(self, value):
self._p = value
并做了以下
obj = A(10)
print(obj.p)
甚至然后我得到以下输出:
10
所以,我想知道@ p.getter在这里的实际用途是什么,当@property自身能够为我们提供_q的值时
如果要覆盖子类中父类的getter,则@property.getter
装饰器可能会很有用。 它使您可以轻松地从父类中“复制”属性,并仅覆盖getter,而保持setter和Deleter不变。
例:
class Parent:
@property
def p(self):
return 'parent'
@p.setter
def p(self, value):
print('setting p to', value)
@p.deleter
def p(self):
print('deleting p')
class Child(Parent):
@Parent.p.getter
def p(self):
return 'child'
print(Parent().p) # output: parent
print(Child().p) # output: child
Child().p = 3 # output: setting p to 3
del Child().p # output: deleting p
函数上的@property
装饰器创建一个新的property
对象, @property
装饰后的函数设置为getter。 因此, 在同一类中 , @p.getter
装饰器不是很有用,不是。
但是,如果要覆盖子类中的getter或仅重用属性的setter,而要完全重用其他类,则装饰器非常有用:
class Foo(object):
@property
def p(self):
return self._p
@p.setter
def p(self, value):
self._p = value
class Bar(Foo):
@Foo.p.getter
def p(self):
return self._p + 10
或将属性对象复制到另一个类中:
class NotASubclass(object):
@Foo.p.getter
def p(self):
return self._p * 10
现在, Bar()
和NotASubclass
的属性p
具有不同的getter,但是它们都重用了Foo()
的属性上定义的setter。
在这两种情况下, @p.getter
装饰器都会创建一个新的property
实例,以作为类对象的属性存储,但是它们的fset
属性都指向充当设置器的同一单个函数对象。 这就是在两种情况下仅引用@Foo.p.getter
就足够了。 您只需要类名称空间中的单个property
实例。
正如您所注意到的,在这种情况下,由于您已经在此处通过了getter,因此完全没有用
@property
def p(self):
return self._p
但至少对于一些极端情况可能有用,例如动态地为现有属性重新定义吸气剂。 我不得不说我实际上从未有过这样的用例,但是很好...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.