现在的位置: 主页 > 新闻中心 > 文章列表

给python类动态添加方法(method)

作者:北京东方雨泽科技有限公司 来源:www.dfyz6789.com 发布时间:2017-09-06 09:42:27
 

给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并不存在, 所以无法这么做.

,可视化专题

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:天门SEO http://tianmen.4567w.com

  • 上一篇:.net应用程序运行的背后机制
  • 下一篇:最后一页
  •