给python类动态添加方法(method)
群里有人问如何做到
def foo():
pass class Bar(object):
pass Bar.set_instance_method(foo) b = Bar()
b.foo()
这个其实还是比较简单的, 只要写个函数给类设置属性即可, 可根据需求是否用函数包装下, 或者用staticmethod这个decorator:
import functools def foo():
print 'hello world' class Bar(object):
def __init__(self):
self.data = 42 @classmethod
def set_instance_method(cls, func):
@functools.wraps(func)
def dummy(self, *args, **kwargs):
func(*args, **kwargs)
setattr(cls, func.func_name, dummy) Bar.set_instance_method(foo) b = Bar()
b.foo()
print b.foo
print Bar.foo
输出
hello world
<bound method Bar.foo of <__main__.Bar object at 0x10d41c890>>
<unbound method Bar.foo>
然后又问如果要这样做怎么写:
def foo():
pass class Bar(object):
set_instance_method(foo)
这样问题就在于set_instance_method运行时如何获得类(Bar), 无奈, 尝试了下,最多也只能得到"Bar"(通过inspect模块).
不是很熟悉python内部原理, 只知道在Bar定义时Bar并不存在, 所以无法这么做.
不过不太清楚问问题的人思路是怎么样的, 如果纯粹是为了研究倒也还好.
如果把代码写成这样, 觉得没什么太多好处, 再加上可能增加了维护成本, 导致维护的人找不到函数的定义.
再者, 你让IDE怎么办.基本只能跑一遍代码才能正确解析了....
给python类动态添加方法(method)的更多相关文章
- 使用runtime给类动态添加方法并调用 - class_addMethod
上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,“其他开发技巧”这个命题对于任何一个开发领域都感觉不找边际,而对于我来 ...
- python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)
介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...
- php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法
1.认识 __set (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...
- 使用TypeDescriptor给类动态添加Attribute
给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overflow看了不少文章,算是最终有了答案. 先是有这样的一段解释 Attributes are stat ...
- iOS运行时使用(动态添加方法)
1 举例 我们实现一个Person类 然后Person 其实是没得对象方法eat:的 下面调用person的eat方法 程序是会奔溃的 那么需要借助运行时动态的添加方法 Person *p = [[ ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- 快速上手Runtime(四)之动态添加方法
如果一个类方法非常多,加载类到内存的时候也比较耗费资源,可以使用动态给某个类,添加方法解决.做到优化内存,节省资源的效果. // // Person.m // ResolveInstanceMetho ...
- 使用TypeDescriptor给类动态添加Attribute【转】
源文 : http://www.cnblogs.com/bicker/p/3326763.html 给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overf ...
- ios开发runtime学习三:动态添加方法(实际应用少,面试)
#import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...
随机推荐
- HW3.21
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- PHP字符串操作汇总
PHP开发中常用的字符串操作介绍 -- 简明现代魔法 PHP学习笔记之字符串的简单处理 - RuanJava的专栏 - 博客频道 - CSDN.NET PHP String 函数
- 发布ASP(非.Net)网站
1.安装IIS 2.设置网址.端口 3.设置文档(默认访问的文档,比如index.asp,index.htm等) 4.双击asp - 展开行为 - 启用父路径:true - 允许访问父目录 5.应用程 ...
- 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
1.查看表空间中数据文件存储的路径以及是否可以自动扩展 SELECT TABLESPACE_NAME, BYTES/1024/1024 FILE_SIZE_MB, FILE_NAME FROM DBA ...
- 在COM接口中不要使用同时出现只是大小写不同的名字作为属性名、函数名或者参数名
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在COM接口中不要使用同时出现只是大小写不同的名字作为属性名.函数名或者参数名.
- java19 先开服务器,再开客户端
先开服务器,再开客户端. import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOExcep ...
- DTrace patch for Python 2.7.x and 3.x
DTrace patch for Python 2.7.x and 3.x Última Actualización: 21 de septiembre de 2015 https://www.jce ...
- 【转】cocos2d-x获取系统时间——2013-08-25 10
欢迎转载,本帖地址:http://blog.csdn.net/jinjian2009/article/details/9449585 之前使用过cocos2d-x获取系统时间,毫秒级的 long ge ...
- struts2+ajax
web网页开发中需要用到struts2来处理action,通过struts2定义后端java类. <action name="loginAction" class=" ...
- <a>制作按钮