码迷,mamicode.com
首页 > 编程语言 > 详细

python高级编程之描述符与属性02

时间:2014-08-22 12:53:08      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:使用   for   代码   log   sp   ad   on   ef   python   

# -*- 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

标签:使用   for   代码   log   sp   ad   on   ef   python   

原文地址:http://www.cnblogs.com/mhxy13867806343/p/3929097.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!