繁体   English   中英

在python中使用属性的getter

[英]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实例。

另请参见@property装饰器如何工作? Python覆盖没有设置器的getter

正如您所注意到的,在这种情况下,由于您已经在此处通过了getter,因此完全没有用

@property
def p(self):
    return self._p

但至少对于一些极端情况可能有用,例如动态地为现有属性重新定义吸气剂。 我不得不说我实际上从未有过这样的用例,但是很好...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM