# -*- 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. Kali for Android

    使用设备:小米平板1 材料:Complete Linux Installer(好像是这个名字,很多应用商店都能下载,所以我就不用送上链接了) 进入app之后,按照着提示做就是了.关于镜像,也是在app ...

  2. Java 下各种设计模式小结

    策略模式--定义算法族,分别封装起来,让它们之间能够互相替换,此模式让算法的变化独立于使用算法的客户.     策略模式是说,针对一种计算,定义一系列的算法,由用户决定详细使用哪一个算法完毕计算. 比 ...

  3. .NET 4.0 兼容 .NET 2.0 的方法

    使用.net开发桌面应用,广大亲门最头疼的莫过于客户端部署的问题.基于.net 2.0 的winfrom程序因为 Framework 的分发包大小为20M左右还好解决,不幸的是如果项目中使用了Wcf, ...

  4. 整理 C#(同步调用、异步调用、异步回调)

    //闲来无事,巩固同步异步方面的知识,以备后用,特整理如下: class Program { static void Main(string[] args) { //同步调用 会阻塞当前线程,一步一步 ...

  5. 基于nginx的rtmp的服务器(nginx-rtmp-module)

    一,首先下载安装nginx需要依赖的库文件: 1.1,选定源码目录 选定目录 /usr/local/RTMP cd /usr/local/RTMP 1.2,安装PCRE库 cd /usr/local/ ...

  6. Light oj 1030 概率DP

    D - Discovering Gold Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768 ...

  7. Ajax中send方法参数的使用

    一般情况下,使用Ajax提交的参数多是些简单的字符串,可以直接使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null. 例如 : var url = " ...

  8. tiny xml 使用总结

    这几天在埋头写自己的3D文件浏览器(稍后发布),突发奇想的要把自己的内部格式转化成XML,于是,把以前在研究所时用过的ExPat翻了出来.ExPat是基于事件的XML解释器,速度挺快的,但结构方面有点 ...

  9. Java中,&&与&;||与|的区别

    我们很多人在学习Java的时候,或者其他语言(如:C#,.Net等)都会遇到&和&&,|和||.然而,如果你没有真正理解他们的意思,这回给你的思路上带来很大的麻烦.在Java的 ...

  10. linux下查找文件和文件内容

    find /xxx -name "*" | xargs grep "某内容" /xxx表示路径,"*"表示在含有某关键字名字下的文件中查找, ...