# -*- 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. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

  2. (转)Android中截取当前屏幕图片

    该篇文章是说明在Android手机或平板电脑中如何实现截取当前屏幕的功能,并把截取的屏幕保存到SDCard中的某个目录文件夹下面.实现的代码如下: /** * 获取和保存当前屏幕的截图 */ priv ...

  3. 响应式布局:Flexbox应用总结

    距离上篇文章<布局神器:Flexbox>的发表已有一周时间,转眼这周又到了周五(O(∩_∩)O~~): 习惯性在周五对自己的一周工作进行下总结,记录下这周值得被纪念的工作事件,无论是好的, ...

  4. [Redux] Generating Containers with connect() from React Redux (VisibleTodoList)

    Learn how to use the that comes with React Redux instead of the hand-rolled implementation from the ...

  5. 自定义seekbar中,thumb被覆盖掉一部分问题

  6. _js day12

  7. [Editor(typeof(ImageUrlEditor), typeof(UITypeEditor))]无效的可能原因

    开发的用户控件封存在dll中,其他都很顺利,就是这个图片弹出选择路径怎么也搞不出来!(浪费了我半天*2,o(︶︿︶)o 唉,犟脾气拗不过 看了很多搜索信息都说加: [Editor(typeof(Ima ...

  8. Label 表达式绑定

    Text='<%#"总金额为: "+Convert.ToString(Convert.ToDecimal(TextBox1.Text)*Convert.ToInt32(Tex ...

  9. c#转码解码

    ///反转码                          mdata[k].MNAME = unescape(mdata[k].MNAME);程家楠 13:51:00 Microsoft.JSc ...

  10. 使用QTP打开应用程序的三种方法

    1. systemUtil.Run ‘SystemUtil对象的Run方法 SystemUtil.Run “http://192.168.11.82/XXX” 参数实例: File:“http://1 ...