赞
赏
在 Python 中,如果我们仅仅使用 property() 函数为 类 的 属性 设置装饰器,那么该属性是只读的,不可以被修改。
如果,我们需要为类属性添加一个可写的装饰器,那么我们需要使用 @propertyname.setter
来修饰类的属性,但此时类的属性是可以被删除的。
如果,我们需要为类属性添加一个删除的装饰器,那么我们需要使用 @propertyname.deleter
来修饰类的属性。
@propertyname.deleter
def propertyname(self, value)
pass
我们使用 @propertyname.deleter
定义了一个装饰器 propertyname,该装饰器的作用是为 propertyname 这个属性提供了 delete 方法。
为类添加了 deleter装饰器之后,我们就可以使用 del 语句或者 delattr() 函数删除类的属性了。
使用 @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
程序运行后,控制台输出如下:
我们为类 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)
程序运行后,控制台输出如下:
我们分别使用 @name.deleter
和 @age.deleter
为 name 属性和 age 属性添加了 deleter 装饰器,此时,我们再次分别使用 del 删除 name 属性和使用 delattr 删除 age 属性,程序不再报错。
删除属性之后,我们再次访问这两个属性的值,发现都变成了 0,即属性被我们删除成功。
在 Python 中,如果我们仅仅使用 property() 函数为类的属性设置装饰器,那么该属性是只读的,不可以被修改。
如果,我们需要为类属性添加一个可写的装饰器,那么我们需要使用 @propertyname.setter
来修饰类的属性,但此时类的属性是可以被删除的。
如果,我们需要为类属性添加一个删除的装饰器,那么我们需要使用 @propertyname.deleter
来修饰类的属性。Python deleter 装饰器语法:
@propertyname.deleter
def propertyname(self, value)
pass