免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1203 | 回复: 1
打印 上一主题 下一主题

python能否给对象动态添加类方法? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-29 07:35 |只看该作者 |倒序浏览
我尝试了一下,不成功:
In [146]: class he:
   .....:     def f1(self):print 'abc'
   .....:     
In [147]: h=he()
In [148]: def f(s):print 'self?'
In [149]: h.f=f
In [150]: h.f()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-150-eb036d1109a6> in <module>()
----> 1 h.f()

我想的是,给h这个对象,动态的添加一个函数,这个函数的第一个参数是对象实例instance,就像类方法的第一个参数self。
能做到吗?


论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
2 [报告]
发表于 2016-12-01 08:45 |只看该作者
  1. #! /usr/bin/python

  2. import sys
  3. import types

  4. def newadd(self,name):
  5.         attrname = ''
  6.         if hasattr(self,'__class__'):
  7.                 if hasattr(self.__class__,'__name__'):
  8.                         attrname = '_%s__array'%(self.__class__.__name__)
  9.                         array = getattr(self,attrname,[])
  10.                         array.append(name)
  11.                         setattr(self,attrname,array)                       
  12.         return


  13. class DynArray(object):
  14.         def __init__(self):
  15.                 self.__array = []
  16.                 return

  17.         def __str__(self):
  18.                 s = '['
  19.                 i = 0
  20.                 for si in self.__array:
  21.                         if i > 0 :
  22.                                 s += ','
  23.                         s += '%s'%(si)
  24.                         i += 1
  25.                 s += ']'
  26.                 return s

  27. def main():
  28.         dyn = DynArray()
  29.         dyn.newadd = types.MethodType(newadd,dyn)
  30.         for s in sys.argv[1:]:
  31.                 dyn.newadd(s)
  32.         print('dyn %s'%(dyn))
  33.         return

  34. if __name__ == '__main__':
  35.         main()
复制代码

回复 1# cdsfiui


上面是可以对内部变量进行修改的。


评分

参与人数 1信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP