类的封装和preperty装饰器

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-29 03:51:38

封装

封装数据的主要原因:保护隐私

封装方法的主要原因:隔离复杂度

提示:在编程语言里,对外提供的接口(入口函数),就是接口函数,这不同于于接口的函数,代表一组接口函数的集合体

两个层面的封装

### 第一层面的封装(什么都不用做)

创建类和对象会分别创建二者的名称空间,我们只能用.类名或者.obj.的方法去访问

注意:对于这一层面的封装(隐藏):类名和实例名就是访问隐藏属性的接口

第二层面的封装:

类中把某些属性和方法隐藏(或者说定义为私有),只有在类的内部使用,外部无法访问,或者留下少量接口(函数)供外部访问

在python中用双下划綫的方式实现隐藏属性(设置为私有)

 

 

property装饰器

  • property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用

property属性的定义和调用需注意:

  1. 定义时,在实例方法的基础上添加@property装饰器,并且只有一个self参数

  2. 调用时无需括号

property属性的功能是:property属性内部进行一系列的逻辑运算,最终将计算结果返回

property属性的两种方式

  1. 装饰器,在方法上应用装饰器

  2. 类属性,在类中定义值为property对象的类属性

装饰器

经典中。具有一种@property装饰器

对应了一种访问方式,其对应被@property修饰的方法

新式类中,具有三种@property装饰器

分别对应了 被@property @方法名.setter @方法名.deleter的修饰方法.

类属性方式

创建值为property对象的类属性

注意:当使用类属性的方式创建property属性时。经典类和新式类无区别

property方法中有四个参数

  1. 第一个参数是方法名,调用对象属性时自动触发方法

  2. 第二个参数是方法名,调用对象属性 =XXX时自动触发方法

  3. 第三个参数是方法名,调用del对象属性时自动触发执行方法

  4. 第四个参数是字符串,调用对象属性.__doc__,此参数是该属性的描述信息

私有属性添加qetter和setter方法

class Money(object):    def __init__(self):        self.__money = 0​    def getMoney(self):        return self.__money​    def setMoney(self, value):        if isinstance(value, int):            self.__money = value        else:            print("error:不是整型数字")

使用property升级qetter和setter方法

class Money(object):    def __init__(self):        self.__money = 0​    def getMoney(self):        return self.__money​    def setMoney(self, value):        if isinstance(value, int):            self.__money = value        else:            print("error:不是整型数字")​    # 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney    money = property(getMoney, setMoney)​​a = Money()a.money = 100  # 调用setMoney方法print(a.money)  # 调用getMoney方法

使用property取代setter和qetter

重新实现一个属性的设置和读取方法,可做边界判断

class Money(object):    def __init__(self):        self.__money = 0​    # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法    @property    def money(self):        return self.__money​    # 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法    @money.setter    def money(self, value):        if isinstance(value, int):            self.__money = value        else:            print("error:不是整型数字")​​a = Money()a.money = 100print(a.money)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!