setter,getters和__set __,__ get__之间的区别

时间:2017-06-13 20:27:47

标签: python setter getter-setter getter magic-methods

代码:

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的用例而不仅仅是在类中设置变量。

我是否认为这一切都错了?

2 个答案:

答案 0 :(得分:1)

使用'@property'描述符控制单个类属性,在您的情况下cls.pineapple_allowed,而__get__, __set__ and __delete__是描述符协议本身的神奇方法。如果你在任何类中覆盖任何上述方法,那么访问/赋值/删除任何类属性都将通过相应的魔术方法。

答案 1 :(得分:1)

  

我很困惑@<func>.setter装饰器与仅覆盖对象中的__set__功能有何不同。与@<func>.getter__get__相同。

无法直接覆盖属性对象上的__set__方法,即使你可以,它也不会做任何事情,因为Python会直接转到属性对象的类在执行属性赋值时查找__set__。当Python将它们作为语言特性的实现时,这适用于大多数双重下划线方法。

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