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装饰器的主要内容,如果未能解决你的问题,请参考以下文章