zoukankan      html  css  js  c++  java
  • Python: 为对象动态添加函数,且函数定义来自一个str

    转自:http://blog.sina.com.cn/s/blog_55a11f330100ab1x.html

    在Python中,通常情况下,你只能为对象添加一个已经写好的方法

    需求:传入一个str类型的变量,其值是一个完整的合法的Python函数定义,然后为一个对象添加这个函数:

    method_str = u'''
    def say(self, name)
        print 'My name is', name
    '''classMyClass:def __init__(self):passdefextends(self, method_name, method_str):#完成这个方法...
    
    obj =MyClass();
    obj.extends('say', method_str)
    obj.say('wendal')#打印出My name is wendal

    想了不少路子,在Python的QQ群里面也得到不少灵感,最后顺利实现:

    defextends(sefl, method_name, method_str):#_method = Noneexec method_str +'''
    _method = %s'''% method_name
            self.__dict__[method_name]=new.instancemethod(_method,self,None)

    简单解释一下: method_str在exec前,改变为:

    method_str = u'''
    def say(self, name)
        print 'My name is', name
    _method = abc

    然后, exec执行后,_method变量就赋值为say函数 接下来,就是Python的自省机制了,通过new模块,生成特定对象(本例中是self)的实例方法 最后,为特定对象添加say这个函数

    恩,这例子,就足以体现出Python在这方面的扩展性 1. method_str是一个字符串,可以动态创建,例如用户输出,模板生成 2. 方法的名字可以通过字符串分割等方法获取到

  • 相关阅读:
    清单
    1
    s
    模块系统的演进
    改radio样式
    前端css库
    疑惑
    收藏
    事件
    社保档案
  • 原文地址:https://www.cnblogs.com/wangjixianyun/p/3420615.html
Copyright © 2011-2022 走看看