在Python中,所谓property属性即被property装饰的方法或者通过property方法创建的对象,property的作用有二,一是让方法可以向普通属性一样直接访问,二是实现对属性的访问控制,防止随意篡改。
(一)property的作用
1、让方法像属性一样可以直接被实例对象访问
import datetime
class Property1:
""" 定义一个具有property属性的类, 实现在每次访问实例属性时都打印访问的时间 """
def __init__(self, message):
self._message = message
@property
def get_info(self):
self.time = datetime.date.today()
return '{} || you visit time is {}'.format(self._message, self.time)
P1 = Property1('Hello Python')
print(P1.get_info) # 通过属性访问方式完成函数调用
2、实现对属性的访问控制,防止随意修改
class Property2:
"""
定义一个具有property属性的类, 实现在每次给实例属性赋值时自动将小写转化为大写, 且传入错误类型
时抛出异常
"""
def __init__(self, info):
self._info = info
@property
def info(self):
print('访问属性')
return self._info
@info.setter
def info(self, value):
print('设置属性')
if isinstance(value, str):
temp = [ i.capitalize() if i.isalpha else i for i in value ]
self._info = ''.join(temp)
return self._info
else:
raise ValueError('wrong type')
# 初始化实例对象
P2 = Property2('Life is short, I use Python!')
P2.info = ' i use python ' # 设置实例属性
P2.info = 1 # 抛出错误异常
print(P2.info)
(二)property的使用方式,要实现property属性通常可以采用两种方式,一是使用装饰器来实现,二是显示调用property方法来实现
"""
1. 通过装饰器方式实现property属性,对需要改造的属性分别使用@property , @属性名.setter, @属
性名.deleter
@property: 访问属性时调用
@属性名.setter:设置属性值时调用
@属性名.deleter:删除属性值时调用
"""
class MyPro1:
def __init__(self, des):
self.__des = des
@property
def info(self):
print('访问属性时调用')
return self.__des
@info.setter
def info(self, value):
print('设置属性时调用')
self.__des = value
@info.deleter
def info(self):
print('删除属性时调用')
if self._info:
del self._info
else:
print('属性不存在')
P1 = MyPro1('PYTHON')
print(P1.info)
P1.info = 'helloworld'
del P1.info
"""
2. 显示调用property方法来实现,需要注意的property方法有四个参数
property(fget=None, fset=None, fdel=None, doc=None)
其中:
fget是一个获取属性值的函数
fset是一个设置属性值的函数
fdel是一个删除属性的函数,
doc是一个字符串(类似于注释)
也就是显示调用property时需要实现对应的方法
"""
class MyPro2:
""" 显示调用property方法实现property属性 """
def __init__(self, string):
self.__string = string
# 获取属性
def get_strings(self):
return self.__string
# 设置属性
def set_strings(self, value):
if isinstance(value, str):
self.__string = value
else:
raise ValueError('wrong type')
# 删除属性
def del_strings(self):
del self.__string
# 显示调用property方法, 使pro_string成为一个property属性,并绑定对应访问、设置、删除的操作
pro_string = property(fget=get_strings, fset=set_strings,
fdel=del_strings, doc='显示调用定义属性描述符')
P2 = MyPro2('Life is short, I use Pyhton !!!')
P2.pro_string = 1
print(P2.pro_string)