Python @property读写装饰器

Python @property读写装饰器教程

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

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

Python setter装饰器详解

语法

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

说明

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

因为这是一个装饰器,因此,我们在调用该方法时,不需要使用 (),即我们调用该装饰器的语法为 instance.propertyname = value 的形式。

案例

setter装饰器

使用 @propertyname.setter 方法,定义读写装饰器

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 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)

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

65_python类property setter装饰器.png

我们希望通过 person.nameperson.age 的形式,给实例变量赋值,但此时程序报错,因为我们使用 @property 修饰的属性是只读属性,因此不可以修改属性的值。我们将程序修改如下:

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)

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

66_python类property setter装饰器.png

我们分别使用 @name.setter@age.setter 为 name 属性和 age 属性添加了 setter 装饰器,此时,我们再次给 name 属性和 age 属性设置值,程序不再报错。

Python @property读写装饰器总结

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

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

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