博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类的封装和preperty装饰器
阅读量:6225 次
发布时间:2019-06-21

本文共 1929 字,大约阅读时间需要 6 分钟。

封装

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

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

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

两个层面的封装

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

创建类和对象会分别创建二者的名称空间,我们只能用.类名或者.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 = 100 print(a.money)

 

转载于:https://www.cnblogs.com/zrx19960128/p/11062123.html

你可能感兴趣的文章
java命令行HPROF Profiler(转)
查看>>
微服务系统中的认证策略
查看>>
关于httpservletrequest的获取真实的ip
查看>>
[20170628]11g修改用户名.txt
查看>>
siebel CRM初学
查看>>
JS组件系列——Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示
查看>>
linux命令之iotop
查看>>
老板必备:核心员工跳槽时,必聊的8个话题(转)
查看>>
C++ 中vector的使用方法
查看>>
基于mysqldump搭建gtid主从
查看>>
Apache Flink fault tolerance源码剖析(五)
查看>>
HTAP数据库 PostgreSQL 场景与性能测试之 18 - (OLAP) 用户画像圈人场景 - 数组包含查询与聚合...
查看>>
GitHub最新命令使用教程
查看>>
web中间件切换(was切tomcat)
查看>>
onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
查看>>
Hadoop: MapReduce2多个job串行处理
查看>>
2017阿里双11交易创建峰值 32.5 万笔/秒!
查看>>
【译】统一样式语言
查看>>
十分钟教程:用Keras实现seq2seq学习
查看>>
Netflix: 使用 React 构建高性能的电视用户界面
查看>>