Python @property只读装饰器

Python @property只读装饰器教程

Python 中,如果我们既要保护 的封装特性,又要让开发者可以使用 “对象.属性” 的方式操作操作 类属性,除了可以使用 property() 函数,Python 还提供了 @property 装饰器。

通过 @property 装饰器,我们可以直接将类的 方法 设置为我们访问类属性的形式,如果我们仅仅使用 @property 修饰类的属性,那么该属性是只读的,不可以被修改。

Python @property详解

语法

@property def funcname(self) pass

说明

我们使用 @property 定义了一个装饰器 funcname,该装饰器的作用是为 funcname 这个属性提供了 get 方法。

因为这是一个装饰器,因此,我们在调用该方法时,不需要使用 (),即我们调用该装饰器的语法为 instance.funcname 而不是 instance.funcname()

案例

只读装饰器

使用 @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 person = Person("haicoder", 18) print("Person name =", person.name, "age =", person.age)

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

61_python类property装饰器.png

我们定义了一个 Person 类,类中定义了 构造函数 和一个私有的 __name 属性一个私有的 __age 属性。

接着,我们分别使用 @property 为 name 属性和 age 属性定义了装饰器,这两个装饰器的作用就是直接返回当前私有的 name 属性和私有的 age 属性的值。

最后,我们实例化了一个 Person 类,并直接使用装饰器访问了类的私有属性的值,注意,这里访问装饰器使用的是 person.nameperson.age 而不是 person.name()person.age()。我们将程序修改如下:

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

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

62_python类property装饰器.png

我们将程序修改为,使用 person.name()person.age() 的方式访问装饰器,而不是 person.nameperson.age,此时程序报错,即我们访问装饰器时,一定不能使用 ()。我们再次将程序修改如下:

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)

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

63_python类property装饰器.png

我们将程序修改为,使用 person.__nameperson.__age 的方式访问类属性,此时程序报错,因为我们定义的 __name__age 是私有属性,因此在外部不可以直接访问。我们再次将程序修改如下:

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)

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

64_python类property装饰器.png

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

Python @property只读装饰器总结

在 Python 中,如果我们既要保护类的封装特性,又要让开发者可以使用 “对象.属性” 的方式操作操作类属性,除了可以使用 property() 函数,Python 还提供了 @property 装饰器。

通过 @property 装饰器,我们可以直接将类的方法设置为我们访问类属性的形式,如果我们仅仅使用 @property 修饰类的属性,那么该属性是只读的,不可以被修改。Python @property语法:

@property def funcname(self) pass