Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2441806
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Python/Ruby

2013-06-25 12:11:59

某些时候我们需要创建一个对象的时候,要根据运行环境来确定对象的类型,这个时候就需要一种方法来动态的创建对象,也就是说类的名字是不确定的。

方法一 利用eval

def getObj(name):
    return eval(name+'()')

方法二 利用getattr函数

比如
modulename = 'haha'#模块字符串
然后:m = __import__(mymodule)

下面方法就可以用python 动态创建类

如果要取得模块中的一个属性的话:可以用getattr(),比如:
c = getattr(m, 'myclass') 
myobject = c() 
但是要注意:如果myclass并不在mymodule的自动导出列表中(__all__),则必须显式地导入,例如:
m = __import__('mymodule', globals(), locals(), ['myclass']) 
c = getattr(m, 'myclass') 
myobject = c()

简单的可以用globals()[class_name]()
  1. def create_obj(cls_name):
  2.     names = cls_name.split(".")
  3.     cls = globals()[names[0]]
  4.     for name in names[1:]:
  5.         cls = getattr(cls, name)

  6.     if isinstance(cls,type):
  7.         return cls()
  8.     else:
  9.         raise Exception("no such class")
如果要使用当前模块:
  1.     classname = 'blabla';
  2.     mod = sys.modules[__name__];
  3.     dynclass = getattr(mod, classname)
  4.     object = dynclass(params);

阅读(6292) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~