2017-06-13 53 views
1

代码:差异__,__ get__

class Pizza: 
    def __init__(self, toppings): 
    self.toppings = toppings 
    self._pineapple_allowed = False 

    @property 
    def pineapple_allowed(self): 
    return self._pineapple_allowed 

    @pineapple_allowed.setter 
    def pineapple_allowed(self, value): 
    if value: 
     password = input("Enter the password: ") 
     if password == "Sw0rdf1sh!": 
     self._pineapple_allowed = value 
     else: 
     raise ValueError("Alert! Intruder!") 

我很困惑的@<func>.setter装饰从仅仅覆盖在物体的__set__功能有何不同。同样的,@<func>.getter__get__

对于这个问题,我想不出用例的用于@property经过短短的类中设置变量。

我在想这一切错了吗?

回答

1

'@property'描述符可以控制一个类的属性,在你的情况下是cls.pineapple_allowed,而__get__, __set__ and __delete__是描述符协议本身的神奇方法。如果您覆盖任何上述方法的任何类,接入/转让/删除任何类别的属性会相应直通魔术方法。

1

我很困惑@<func>.setter修饰器与刚刚覆盖对象中的__set__函数不同。同样的,@<func>.getter__get__

不能直接覆盖属性对象的__set__方法,即使你能,它不会做任何事情,因为Python将直接进入属性对象的类属性执行时,发现__set__分配。当Python正在将它们视为语言功能的实现时,这适用于大多数双双下划线方法。

使用.setter将函数记录在属性对象的实例属性中,该属性将由__set__委托给其执行设置。