`
zuroc
  • 浏览: 1309586 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

《在路上 …》 写代码也需要一点演技 – python2.6 的 class decorator

阅读更多

写通用的回复类, 原本打算做成一个独立的基类


class ReplyBase(object):

    _REPLY_REALTED_CLS = None                                                              

    _REPLY_CLS = None                                                               

    mc_reply_id_by_rid = McLimitA(                                                  

        "ReplyIdBy%sId:%%s"%_REPLY_RCLS.Meta.table.title(),                         

        128                                                                         

    )

    ...


写下来以后, 忽然想到        


"ReplyIdBy%sId:%%s"%_REPLY_RCLS.Meta.table.title(),                         


在基类定义的时候就被确定了, 不好搞


这样下去就只有用Meta Class


不过正如 洪教授 所言 ( http://www.infoq.com/cn/interviews/douban-hqn )


Meta Class 是种黑魔法, 正派人士都很畏惧它.


虽然有部YY小说, 标题叫做"魔本是道", 不过这也就是纯属意淫, 估计连本实体书都没有.


正如我昨天说过的 做人需要一点演技( http://www.douban.com/note/101804926/ )


写代码也不能太暴露内心的邪恶念头.


decorator, 正如其名, 装饰器, "装"是核心词, 是我圣教中人, 行走江湖必备的技能. 


好吧, 过去我常常以"张教主"自诩, 不过一晃也有很多年没进行官方的正式声明了. 


江湖儿女江湖老,昏昏灯火忆平生.


言归正传, 先来做一个小实验, 用函数动态添加一个基类


class C(object):

    def x(self):

        return self.__class__


class B(object):

    pass


class A(B):

    pass


def main():

    print "A.__bases__ before", A.__bases__

    A.__bases__ = tuple(list(A.__bases__)+[C, ])

    print "A.__bases__ after", A.__bases__

    print "A().x()", A().x()


输出是


A.__bases__ before (<class '__main__.B'>,)

A.__bases__ after (<class '__main__.B'>, <class '__main__.C'>)

A().x() <class '__main__.A'>


人体试验很成功, 我很开心


当然, 我这里有些细节懒得交代了, 我是工科生, 不是理科生, 我只追求可以work的solution, 不考究背后theory. 何况我本科文凭中还有"医学"两个字符.


医学是只看结果不问过程的.


不过, 如果你遇到什么问题, 可以从这里开始探索 http://blog.donews.com/limodou/archive/2005/01/06/227676.aspx


说了这么多, 还是直接上代码吧, 代码是很无趣. 就像武功秘籍一样.


找秘籍的人永远很多, 炼成的永远很少.


这还是精简演示版, 很多接口没做.


如果说Meta Class是基因改造,  class decorator就像是整容手术了. 下面正式开工


=================================================


#!/usr/bin/env python

#coding:utf-8

from init_db import McModel, McCacheA, McCache, Model, mc, cursor_by_table, McLimitA

from const.man import STATE_DEL, STATE_APPLY, STATE_ACTIVE, STATE_BAN


class ReplyMixin(object):

    def new_reply(self, man_id, txt, state=STATE_ACTIVE):

        rid = self.id

        self.reply_count += 1

        self.save()

        s = self._REPLY_CLS(rid=rid, man_id=man_id, state=state)

        s.txt = txt

        s.save()

        self.mc_reply_id_by_rid.delete(rid)

        return s



    def reply_list(self, offset, limit):

        return self._REPLY_CLS.mc_get_list(

            self.reply_id_list(offset, limit)

        )


def mixin_reply(reply_cls):

    """

@mixin_reply(XxxReply)

class Xxx(McModel):

    pass

    """

    def _(cls):

        cls.__bases__ = tuple(list(cls.__bases__)+[ReplyMixin, ])

        cls.mc_reply_id_by_rid = McLimitA(

            "ReplyIdBy%sId#%%s"%cls.Meta.table.title(),

            128

        )

        cls._REPLY_CLS = reply_cls

        cls.reply_id_list = cls.mc_reply_id_by_rid("{self.id}")(

            reply_id_list

        )

        return cls

    return _


def reply_id_list(self, offset, limit):

    c = self._REPLY_CLS.raw_sql(

        "select id from " +

        self._REPLY_CLS.Meta.table +

        " where rid=%s and state>%s order by create_time limit %s offset %s",

        self.id, STATE_APPLY, limit, offset

    )

    return [i for i, in c.fetchall()]




=============================


同时为了统一管理, 迁移原来的一些reply函数到新代码上, 但是保留原接口


=============================


--- mysite/model/review.py (revision 3071)

+++ mysite/model/review.py (working copy)


+from reply import mixin_reply

 

 

 class ReviewReply(McModel):

     pass

 

+@mixin_reply(ReviewReply)

class Review(McModel):

    txt = review_txt.property

 

 def review_reply_by_review_id(id, offset, limit):

-    return ReviewReply.mc_get_list(

-        review_reply_id_by_review_id(id, offset, limit)

+    return Review(id).reply_list(

+        offset, limit

     )

 

 def review_reply_new(review_id, man_id, txt, state=STATE_ACTIVE):

     r = Review.mc_get(review_id)

-    if r:

-        r.reply_count += 1

-        r.save()

-        s = ReviewReply(rid=review_id, man_id=man_id, state=state)

-        s.txt = txt

-        s.save()

-        mc_review_reply_id_by_review_id.delete(s.id)

-        return s

+    return r.new_reply(man_id,txt,state)




文章同步自 http://kanrss.com/~onway/t/110
同步程序见 这里
作者 张沈鹏



分享到:
评论

相关推荐

    python装饰器decorator介绍

    其实也就是其他语言中的AOP的概念,将对象或函数的真正功能也其他辅助的功能的分离。 二、Python中的decorator python中的decorator通常为输入一个函数,经过装饰后返回另一个函数。 比较常用的功能一般使用...

    python中完善decorator共5页.pdf.zip

    装饰器本质上是一个Python函数,它可以让其他函数或类在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。在Python中,装饰器通常通过`@decorator`的形式应用到函数定义上。 标题...

    decorator python(decorator-3.4.0.tar.gz).rar

    装饰器在Python编程语言中是一种强大的工具,它允许程序员在不修改原有代码的基础上,增加或扩展函数的功能。这个"decorator python"模块是版本3.4.0的实现,其核心概念是通过函数来包装(即装饰)其他函数,以增强...

    A Byte of Python3 附源代码

    总之,《A Byte of Python3》是学习Python 3的宝贵资源,它涵盖了从基本语法到高级特性的全面内容,配合源代码的实践,将使你在Python编程之路上走得更远。无论你是编程新手还是经验丰富的开发者,都能从中受益。

    python decorator==4.4.2

    在"python decorator==4.4.2"版本中,我们可以探讨这个库提供的装饰器功能及其在Odoo中的应用。 首先,让我们理解什么是Python装饰器。装饰器本质上是一个接收函数作为参数并返回新函数的函数。通过在定义函数前...

    Python装饰器decorator用法实例

    Python装饰器是编程中一种强大的工具,用于在不修改原函数代码的情况下,向函数添加额外功能。装饰器本质上是一个接收函数作为输入并返回新函数的函数。这种设计模式在Python中广泛使用,因为它允许程序员优雅地扩展...

    进阶Python-高级代码

    11. **动态类型系统**:Python是动态类型的,变量的类型在运行时确定,这使得编写代码更加灵活,但同时也可能导致一些类型错误,需要注意类型检查。 通过深入学习以上知识点,开发者将能够更好地理解和利用Python的...

    python中编写无参数decorator共4页.pdf

    Python中的装饰器(Decorator)是高级函数编程的一个重要特性,它允许我们修改或增强其他函数的功能,而无需改动原函数的代码。在Python中,装饰器本质上是一个接收函数作为参数并返回新函数的函数。本资料"python中...

    Python库 | drf_nested_decorator-0.3-py2-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:drf_nested_decorator-0.3-py2-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    python源代码

    6. **函数与装饰器**:函数是Python中可重用代码的基本单元,源代码中可能会有自定义函数,以及使用装饰器(@decorator)来修改或增强函数功能的例子。 7. **异常处理**:通过try-except块,源代码可以捕获并处理...

    python实现Decorator模式实例代码

    本文研究的主要是python实现Decorator模式,具体介绍如下。 一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子: # -*- coding: utf-8 -*- ...

    12步入门Python中的decorator装饰器使用方法

    装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。...在Python 2.6以及之后的Python版本中,装饰器被进一步用于加工类。 1. 函数 在python中,函数通过def关键字、函数名和

    python-base.py: 千行代码入门Python python-visual.py: 15张图入门Matplotlib

    python_base.py: 千行代码入门Python python_visual.py: 15张图入门Matplotlib python_visual_animation.py: 使用Matplotlib画...python_decorator.py: Python进阶: 通过实例详解装饰器(附代码) python_datetime.p

    Python装饰器模式学习demo

    这种设计模式在Python中非常常见,因为它提供了一种灵活的方式来扩展功能,保持代码的整洁和模块化。 在"Python装饰器学习demo"中,我们可以探索以下几个关键知识点: 1. **基础装饰器**:装饰器的基本形式是一个...

    [Python学习手册(第4版)].源代码

    《Python学习手册(第4版)》的源代码包含了丰富的Python编程知识,是学习和深入理解Python语言的重要资源。此套源代码旨在帮助读者通过实际的示例来探索Python的各种特性和用法,涵盖从基础语法到高级概念的广泛内容...

    python中编写带参数decorator共5页.pdf

    Python中的装饰器是一种强大的工具,它允许我们修改或增强函数、类或其他可调用对象的行为,而无需修改它们的源代码。在Python编程中,装饰器尤其常见,用于日志记录、性能测试、缓存、权限控制等场景。当我们谈论...

    装饰器decorator_python_

    装饰器在Python编程中是一种强大的工具,它允许我们在不修改原始函数代码的前提下,为函数添加新的功能或行为。装饰器本质上是Python中的一个函数,它接收一个函数作为参数,并返回一个新的函数。这种设计模式在很多...

    Python库 | potemkin_decorator-0.0.7-py3-none-any.whl

    总的来说,Potemkin Decorator库是Python开发者的一个实用工具,它通过提供预定义的装饰器,帮助简化代码结构,增强代码功能,并且保持代码的整洁性。对于任何Python项目来说,合理利用装饰器都是提高代码质量和效率...

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可扩展性和低耦合性。 在Python和C++这两种语言中,装饰模式的实现方式有所不同,但核心思想是一致的。让我们...

Global site tag (gtag.js) - Google Analytics