Python之property属性及其实现

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

你可能感兴趣的:(python,开发语言)