python 授权
1.“包装”意思是一个已经存在的对象进行包装,不管他是数据类型还是一段代码,可以是对一个已经存在的对象增加新的,删除不要的或者修改其他已经存在的功能
2.包装 包括定义一个类,他的实例拥有标准类型的核心行为,换句话说,他现在不仅能唱能跳,还能像原类型一样步行。
这个图片说明了在类中包装的类型看起来像什么样子,在图的中心为标准类型的核心行为,但他也通过新的或者最新的功能,甚至可能通过访问实际数据的不同方法得到提高
3.实现授权是包装的一个特性,可用于简化处理相关命令性功能,采用也存在的功能以达到最大限度的代码重用。
4.实现授权的关键点是覆盖__getattr__() 方法,在代码中包含一个对getattr()内建函数的调用,调用getattr()得到默认对象的属性(数据属性或者方法)并返回他以便于访问或者调用。
#! /usr/bin/env python
#coding:utf-8
"""
包装对象的授权
"""
class WrapMe(object):
def __init__(self,obj):
self.__obj=obj;
def get(self):
return self.__obj
def __str__(self):
return self.__obj
__repr__=__str__
def __getattr__(self, item):
"这个方法用于实现授权,即返回的对象可以使用接受到的对象的属性(方法,函数),但是不能使用原有对象的特殊行为"
return getattr(self.__obj,item)
#以复数为例
m=WrapMe(3.5+4.2j)
print m.real #3.5 这就是复数这个对象的方法,此时因为进行了授权,我们任然可以使用复数的属性
"""
搜索属性的顺序是 解释器将试着在局部名称空间中查找哪个名字,如果没有就搜索类名称空间,最后如果两个搜索都是失败了,搜索则对原对象开始授权请求,此时__getattr__()会被调用
"""
"getattr()这个函数没有办法做到让对象使用原有对象的特殊行为,比如列表的切片属性"
m1=WrapMe(['a','b','c'])
#print m1[1] #TypeError: 'WrapMe' object does not support indexing
#这就是为什么我们要在类中创建一个get()函数,他返回了原来的对象
m_list=m1.get()
print m_list[1] #b 成功解决问题
"""
对比
"""
class WrapMe_compare(object):
def __init__(self,obj):
self.__obj=obj;
def get(self):
return self.__obj
def __str__(self):
return self.__obj
__repr__=__str__
mc=WrapMe_compare(3.5+4.2j)
#print mc.real() #AttributeError: 'WrapMe_compare' object has no attribute 'real' 这就是没有进行授权
5.包装标准类型
#!/usr/bin/env python
#coding:utf-8
"""
包装标准类型
"""
from time import time,ctime,sleep
class TimeWrapMe(object):
def __init__(self,obj):
self.__data=obj;
self.__mtime=self.__ctime=self.__atime=time();
def get(self):
"获取属性,需要修改访问时间"
self.__atime=time();
return self.__data;
def gettimeval(self,t_type):
if not isinstance(t_type,str) or t_type not in 'cma':
raise TypeError,"argument of 'c','m','a'";
return getattr(self,"_%s__%stime"%(self.__class__.__name__,t_type)); #相当于getattr(self,_TimeWrapMe__(c|m|a)time),传过去的是修改,更新,创建的时间
def gettimestr(self,t_type):
"获取时间,返回一个经time.ctime()函数格式化的字符串形式的时间"
"""
ctime(seconds) -> string
"""
return ctime(self.gettimeval(t_type));
def set(self,obj):
"修改实例属性,同时自动刷新修改时间"
self.__mtime=time();
self.__data=obj;
def __repr__(self):
self.__atime=time();
return self.__data;
def __str__(self):
self.__atime=time();
return str(self.__data);
def __getattr__(self, item):
"授权"
self.__atime=time();
return getattr(self.__data,item);
t=TimeWrapMe(932)
print t.gettimestr('c')
print t.gettimestr('m')
print t.gettimestr('a')
print "{:*^30}".format('*')
sleep(3) #3秒之后再次进行访问
print t.get()
print t.gettimestr('c')
print t.gettimestr('m')
print t.gettimestr('a')
结果:
Mon Sep 26 13:04:16 2016
Mon Sep 26 13:04:16 2016
Mon Sep 26 13:04:16 2016
******************************
932
Mon Sep 26 13:04:16 2016
Mon Sep 26 13:04:16 2016
Mon Sep 26 13:04:19 2016 #访问时间发生了改变
python 授权的更多相关文章
- 2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区
不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是 ...
- 2014 年最热门的国人开发开源软件TOP 100
不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外认可.中国是开 ...
- 2014 top100
下面是 TOP 100 的软件列表: 1. JFinal JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展. ...
- 2015 年最热门的国人开发开源软件 TOP 50
开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2015 年最热门的国产开源软件前五十名,让 ...
- csv文件数据导出到mongo数据库
from pymongo import MongoClientimport csv# 创建连接MongoDB数据库函数def connection(): # 1:连接本地MongoDB数据库服务 co ...
- python-pandas读取mongodb、读取csv文件
续上一篇博客(‘’selenium爬取NBA并将数据存储到MongoDB‘)https://www.cnblogs.com/lutt/p/10810581.html 本篇的内容是将存储到mongo的数 ...
- selenium爬取NBA并将数据存储到MongoDB
from selenium import webdriver driver = webdriver.Chrome() url = 'https://www.basketball-reference.c ...
- 2014年最热门的国人开发开源软件TOP100
2014年最热门的国人开发开源软件TOP100 不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多 ...
- 2015年热门的国产开源软件TOP 50
2015年热门的国产开源软件TOP 50 开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2 ...
随机推荐
- 纯html页面中js如何获得项目路径
js,全称javascript,不过虽然是以java开头,不过与java一点关系都没有. js和java有如下区别: (1)js是浏览器端的语言,而java是服务器端的语言. (2)js是动态语言,j ...
- Struts学习总结-02 上传文件
Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的目录,以确保数据不丢失. ...
- 使用Topshelf管理Windows服务
目的:以控制台方式开发Windows服务程序,调试部署方便. https://www.cnblogs.com/itjeff/p/8316244.html https://www.cnblogs.com ...
- 微软下一代Web前端技术Blazor(C#编译为WebAssembly)
W3C Web标准化机构在制定下一代的网页技术WebAssembly.目前版本是1.0,主流浏览器的最新版本都已经支持.其特点是浏览器可以执行编译后的二进制程序,不需要像之前的程序,浏览器下载Java ...
- JavaWeb开发中采用FreeMarker生成Excel表格
最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多.由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求.这里介绍种采用FreeM ...
- WPF 带清除按钮的文字框SearchTextBox
原文:WPF 带清除按钮的文字框SearchTextBox 基于TextBox的带清除按钮的搜索框 样式部分: <!--带清除按钮文字框--> <Style TargetType=& ...
- Luogu P4016 负载平衡问题
传说中的网络流24题之一,我刷的第二题菜. 据说这种东西做完了就可以有质的飞越?不过看着这些Luogu评级就有点蒙蔽. 首先我们看一下题目发现这不是均分纸牌的加强板吗,但是那个环的操作极大地限制了我的 ...
- 【php增删改查实例】第十八节 - login.php编写
1.对用户名和密码进行非空判断(后台验证) $username; $password; if(isset($_POST['username']) && $_POST['username ...
- Scala学习(五)---Scala中的类
Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...
- Bayesian Personalized Ranking 算法解析及Python实现
1. Learning to Rank 1.1 什么是排序算法 为什么google搜索 ”idiot“ 后,会出现特朗普的照片? “我们已经爬取和存储了数十亿的网页拷贝在我们相应的索引位置.因此,你输 ...