代码:
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
的用例而不仅仅是在类中设置变量。
我是否认为这一切都错了?
答案 0 :(得分:1)
使用'@property'描述符控制单个类属性,在您的情况下cls.pineapple_allowed
,而__get__, __set__ and __delete__
是描述符协议本身的神奇方法。如果你在任何类中覆盖任何上述方法,那么访问/赋值/删除任何类属性都将通过相应的魔术方法。
答案 1 :(得分:1)
我很困惑
@<func>.setter
装饰器与仅覆盖对象中的__set__
功能有何不同。与@<func>.getter
和__get__
相同。
你无法直接覆盖属性对象上的__set__
方法,即使你可以,它也不会做任何事情,因为Python会直接转到属性对象的类在执行属性赋值时查找__set__
。当Python将它们作为语言特性的实现时,这适用于大多数双重下划线方法。
使用.setter
代替在属性对象的实例属性中记录该函数,__set__
将委托它来执行设置。