Python @property deleter装饰器

Python @property deleter装饰器教程

Python 中,如果我们仅仅使用 property() 函数为 属性 设置装饰器,那么该属性是只读的,不可以被修改。

如果,我们需要为类属性添加一个可写的装饰器,那么我们需要使用 @propertyname.setter 来修饰类的属性,但此时类的属性是可以被删除的。

如果,我们需要为类属性添加一个删除的装饰器,那么我们需要使用 @propertyname.deleter 来修饰类的属性。

Python deleter装饰器详解

语法

@propertyname.deleter def propertyname(self, value) pass

说明

我们使用 @propertyname.deleter 定义了一个装饰器 propertyname,该装饰器的作用是为 propertyname 这个属性提供了 delete 方法。

为类添加了 deleter装饰器之后,我们就可以使用 del 语句或者 delattr() 函数删除类的属性了。

案例

deleter装饰器

使用 @propertyname.deleter 方法,定义删除装饰器

print("嗨客网(www.haicoder.net)") class Person(object): def __init__(self, name, age): self.__name = name self.__age = age @property def name(self): return self.__name @property def age(self): return self.__age @name.setter def name(self, val): self.__name = val @age.setter def age(self, val): self.__age = val person = Person("haicoder", 18) print("Person name =", person.name, "age =", person.age) person.name = "HaiCoder" person.age = 109 print("Person name =", person.name, "age =", person.age) del person.name

程序运行后,控制台输出如下:

67_python类property deleter装饰器.png

我们为类 Person 分别添加了 name 属性和 age 属性的 get 和 set 装饰器,但没有添加 del 装饰器,因此,我们使用 del 删除类属性之后,程序报错,我们将程序修改如下:

print("嗨客网(www.haicoder.net)") class Person(object): def __init__(self, name, age): self.__name = name self.__age = age @property def name(self): return self.__name @property def age(self): return self.__age @name.setter def name(self, val): self.__name = val @age.setter def age(self, val): self.__age = val @name.deleter def name(self): self.__name = 0 @age.deleter def age(self): self.__age = 0 person = Person("haicoder", 18) print("Person name =", person.name, "age =", person.age) person.name = "HaiCoder" person.age = 109 print("Person name =", person.name, "age =", person.age) del person.name delattr(person, 'age') print("Person name =", person.name, "age =", person.age)

程序运行后,控制台输出如下:

68_python类property deleter装饰器.png

我们分别使用 @name.deleter@age.deleter 为 name 属性和 age 属性添加了 deleter 装饰器,此时,我们再次分别使用 del 删除 name 属性和使用 delattr 删除 age 属性,程序不再报错。

删除属性之后,我们再次访问这两个属性的值,发现都变成了 0,即属性被我们删除成功。

Python @property deleter装饰器总结

在 Python 中,如果我们仅仅使用 property() 函数为类的属性设置装饰器,那么该属性是只读的,不可以被修改。

如果,我们需要为类属性添加一个可写的装饰器,那么我们需要使用 @propertyname.setter 来修饰类的属性,但此时类的属性是可以被删除的。

如果,我们需要为类属性添加一个删除的装饰器,那么我们需要使用 @propertyname.deleter 来修饰类的属性。Python deleter 装饰器语法:

@propertyname.deleter def propertyname(self, value) pass