# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

#元描述符

#特点是:使用宿主类的一个或者多个方法来执行一个任务,可能对降低使用提供步骤的类所需要的代码量很有用,比如一个链式描述符可以调用类的一系统方法以返回一组结果,它可以在失败的时候停止,并且配备一个回调机制以获得对过程更多控制,如下

class Chainer(object):

def __init__(self,a,b=NotImplementedError):

self._a=a

self._b=b

def __get__(self, instance, owner):

if instance is None:

#只针对实例

return self

result=[]

for methond in self._a:

result.append(methond(instance))

if self._b is not None:

if not self._b(instance,methond,result):

break

return result

#这一实现各种类方法之上运行计算能与记录器这样的外部元素结合起来,如下

class TextProcess(object):

def __init__(self,text):

self.text=text

def normalize(self):

if isinstance(self.text,list):

self.text=[t.lower() for t in self.text]

else:

self.text=self.text.lower()

def split(self):

if not isinstance(self.text,list):

self.text=self.text.split()

def treshold(self):

if not isinstance(self.text,list):

if len(self.text)<2:

self.text=''

self.text=[w for w in self.text if len(w)>2]

def logger(insetace,method,results):

print 'calling %s'%method.__name__

return True

def add_sequen_ce(name,sequence):

setattr(TextProcess,name,Chainer([getattr(TextProcess,n)for n in sequence],logger))

#add_sequen_ce用来动态的定义一个新链式调用方法的描述符,这一个组合结果可以被保存在类定义中,如下

add_sequen_ce('simoke_clean',('split','trshold'))

my=TextProcess('My Taylor is Rich')

my.simple_chean

my.text

#执行另一个序列

add_sequen_ce('simoke_clean',('normailze','split','trshold'))

my.simple_chean

my.text

#由于python动态特性,可以在运行时再添加这种描述符以执行元编程

#定义

"""

元编程(meta-programming)在运行时通过添加新的计算功能,或者改变已有功能来改变程序行为的一种技巧,与的编程不同,在其他语言中,需要创建新的代码块,而不是提供可以应对最多情况简单代码块

它也和{生成性编程{generative programming}}不同,这样编程方式通过模块来生成一段静态源代码,可以看:en.wikipedia.org/wiki/generative programming

"""

python高级编程之描述符与属性02的更多相关文章

  1. python高级编程之描述符与属性03

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #属性Property #提供了一个内建描述符类型,它知道如何将一个 ...

  2. python高级编程之最佳实践,描述符与属性01

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的 ...

  3. python描述符和属性查找

    python描述符 定义 一般说来,描述符是一种访问对象属性时候的绑定行为,如果这个对象属性定义了__get__(),__set__(), and __delete__()一种或者几种,那么就称之为描 ...

  4. Python 属性描述符和属性的查找过程

    属性描述符可以用来控制给属性赋值的时候的一些行为 import numbers class IntField: def __get__(self, instance, owner): return s ...

  5. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  6. Python高级编程和异步IO并发编程

    第1章 课程简介介绍如何配置系统的开发环境以及如何加入github私人仓库获取最新源码. 1-1 导学 试看 1-2 开发环境配置 1-3 资源获取方式第2章 python中一切皆对象本章节首先对比静 ...

  7. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  8. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  9. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

随机推荐

  1. C++简介

    本文仅用于学习交流,转载请注明:http://www.cnblogs.com/mxbs/p/6266466.html  Hello,C++ World! 简介: C++融合了3中不同的编程传统:C语言 ...

  2. http接口测试浏览器插件

    http接口测试浏览器插件: Chrome: https://chrome.google.com/webstore/detail/chrome-poster/cdjfedloinmbppobahmon ...

  3. android中使用哪种方式解析XML比較好

    SAX是一个用于处理XML事件驱动的"推"模型. 长处是一种解析速度快而且占用内存少的xml解析器,它须要哪些数据再载入和解析哪些内容. 缺点是它不会记录标签的关系.而要让你的应用 ...

  4. linux的chattr和lsattr命令

    chattr是用来改变文件.目录属性.chattr命令的作用很大,其中一些功能是由linux内核版本来支持的.通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录.lsattr是 ...

  5. IOS开发之格式化日期时间

    IOS开发之格式化日期时间(转)   在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如: //实例化一个NSDateFor ...

  6. js_day13

  7. GridControl 设置焦点单元格

    gdvNew.Focus(); //GridControl 控件获取焦点 gdvNew.FocusedRowHandle = _smtReport.Count - 1; //设置焦点行 gdvNew. ...

  8. ajaxFileUpload js判断类型

    function ajaxFileUpload() {    var File_box = document.getElementById('V_file');    var extend = Fil ...

  9. ubuntu中安装jdk

    1.下载jdk压缩包: http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz 2.解压缩jdk ...

  10. js实现IE/Firefox的收藏功能

    代码: function addFavorite(el){ var url = window.location.href, title = $('head').find('title').html() ...