python def method_给python类动态添加方法(method)
群里有人問如何做到
deffoo():pass
classBar(object):passBar.set_instance_method(foo)
b=Bar()
b.foo()
這個其實還是比較簡單的, 只要寫個函數給類設置屬性即可, 可根據需求是否用函數包裝下, 或者用staticmethod這個decorator:
importfunctoolsdeffoo():print ‘hello world‘
classBar(object):def __init__(self):
self.data= 42@classmethoddefset_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()printb.fooprint Bar.foo
輸出
hello world
>
然后又問如果要這樣做怎么寫:
deffoo():pass
classBar(object):
set_instance_method(foo)
這樣問題就在于set_instance_method運行時如何獲得類(Bar), 無奈, 嘗試了下,最多也只能得到"Bar"(通過inspect模塊).
不是很熟悉python內部原理, 只知道在Bar定義時Bar并不存在, 所以無法這么做.
不過不太清楚問問題的人思路是怎么樣的, 如果純粹是為了研究倒也還好.
如果把代碼寫成這樣, 覺得沒什么太多好處, 再加上可能增加了維護成本, 導致維護的人找不到函數的定義.
再者, 你讓IDE怎么辦.基本只能跑一遍代碼才能正確解析了....
原文:http://www.cnblogs.com/cfy42/p/3834654.html
總結
以上是生活随笔為你收集整理的python def method_给python类动态添加方法(method)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个值得收藏的小工具
- 下一篇: vue在微信里面的兼容问题_vuejs在