Python中的property类和@property装饰器

Posted 小斌哥ge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的property类和@property装饰器相关的知识,希望对你有一定的参考价值。


Python中的property类和@property装饰器

在Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法。

如果我们需要访问私有属性和私有方法,可以用包含get/set的方法来间接访问。

如果要避免脏数据的出现,隐藏方法实现细节,保证数据的安全性,我们可以在包含get/set的方法中添加一些验证和干扰的代码。

get/set是通过方法的方式来间接访问属性和方法,接下来我们介绍通过属性的方式来访问属性和方法:property。

一、property类的使用

property的意义就是属性、性质,在python中主要用来为属性操作提供便利。

在Python中,提供了一个叫做property的类,通过创建property类的对象,来将私有属性设置成普通的属性,可以不再使用属性的get方法的调用方式,而像普通的公有属性一样去使用属性。

class City(object):

def __init__(self):
self.__name = SZ
self.__person = 1000000

def __get_name(self):
return self.__name

def __set_person(self, person):
if isinstance(person, int):
if person > 1000000:
self.__person = person
else:
print(输入的人数错误!)
else:
print("人数是正整数!")

def __get_person(self):
return self.__person

# 通过创建property的对象,将私有方法变成一个属性给外部访问
name = property(__get_name)
# 通过创建property的对象,将私有属性变成外部可以访问和修改该的属性
person = property(__get_person, __set_person)


c = City()
print(c.name)
print(c.person)
# name属性没有写set的相关方法,所以property对象属性在外部不能修改
# c.name = GZ
print(c.name)
c.person = 100000000
print(c.person)

运行结果:

SZ
1000000
SZ
100000000

property是一个类,init方法由四个参数组成(可点击进入源码查看),实例化后返回一个用来操作属性的对象

参数一:属性的获取方法,参数二:属性的设置方法,参数三:属性的删除方法,参数四:属性的描述

通过property类实例对象以后,在使用对象中的属性时,就可以像使用普通公有属性一样来调用。

但是实际调用的还是set/get方法,如上面的name没有set方法,所以不能修改值。

在实例property对象时,不是所有的参数都需要写,比如示例中的name只提供了get方法,person只提供了get方法和set方法,并且都是私有的方法(property里也可以传入普通方法)。这样就完全隐藏了内部的实现细节。

二、@property装饰器的使用

Python语法中,装饰器的作用是提供装饰的功能,在不改变原来函数功能的基础上,添加新的功能。

这种形式被称为语法糖。语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更好用的语法。 

利用@property装饰器,可以用来简化使用property类的方法。

class City(object):

def __init__(self):
self.__name = SZ
self.__person = 1000000

@property
def name(self):
return self.__name

@property
def person(self):
return self.__person

@person.setter
def person(self, person):
if isinstance(person, int):
if person > 1000000:
self.__person = person
else:
print(输入的人数错误!)
else:
print("人数是正整数!")


c = City()
print(c.name)
print(c.person)
# name属性没有写set的相关方法,所以property对象属性在外部不能修改
# c.name = GZ
print(c.name)
c.person = 100000000
print(c.person)

运行结果:

SZ
1000000
SZ
100000000

通过@property装饰器的方式,可以替换property类的方法,使用起来更简单。

注意:

1.在使用@property装饰属性时,只能装饰获取方法(获取属性的方法)

2.@property装饰属性时,set/get方法不需要在属性名前加set和get,直接写属性名即可

3.如果一个属性同时有set/get方法,那么要先实现@property对获取方法的定义,再实现设置方法的定义,定义set方法时使用  @xxx.setter装饰,xxx要和获取方法名保持一致。如:上面的person获取方法被@property装饰,person设置方法被 @person.setter装饰

 

 

Python中的property类和@property装饰器_Python

 

以上是关于Python中的property类和@property装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python @property

python基础之封装

Properties集合

Qt 中的 Q_PROPERTY?

[Hibernate] 通过 properties 类和 hql 语句进行动态查询

Configutation读取properties文件信息