2012-07-13 126 views
0

如何动态调用模块(代码)中的函数?如何动态调用函数是一个模块?

例如:

class Class1(object): 
    pass 

class Class2(object): 
    pass 

# here I want to either instantiate object dynamically or dynamically pass 
# a Class1 or Class2 object to some other method/class inside this module code 
+0

你将不得不变得更具体。也许有更多的代码示例? – 2012-07-13 21:21:06

+0

你到目前为止尝试过什么?在Python中,你可以像任何其他对象一样传递类。 – Philipp 2012-07-13 21:21:22

+1

Python是弱类型的。没有什么限制你将任何一个类型的对象传递给任何函数 – Wug 2012-07-13 21:21:48

回答

4

你的意思是这样的吗?

>>> class Class1(object): 
...  pass 
... 
>>> class Class2(object): 
...  pass 
... 
>>> def foo(cls): 
...  print cls 
... 
>>> import random 
>>> classes = {'Class1': Class1, 'Class2': Class2} 
>>> dynamic_class = classes['Class%d' % random.randint(1, 2)] 
>>> foo(dynamic_class()) 
<__main__.Class1 object at 0x10b44ab50> 
+1

如果你明确地创建了由locals()返回的字典,我认为这个例子会更有建设性。 – mgilson 2012-07-13 21:28:13

+0

@mgilson:已更新。显式更好。 – sberry 2012-07-13 22:03:50

+0

同意。 (+1)为你的努力(和很好的例子) – mgilson 2012-07-13 22:14:17

2

我假设你的意思是你想通过名称来访问类。

如果你想要的类在同一模块中,请尝试使用globals()[classname]()来实例化类。如果它在另一个模块中,请尝试使用vars(module)[classname]()getattr(module, classname)()

classname是包含类的名称的字符串; module是模块,而不是一个字符串的引用。)

+0

我从来没有见过'vars(module)[classname]()'。有没有理由比'getattr'更喜欢这个? (或者这是另一个番茄,番茄的东西?) – mgilson 2012-07-13 21:29:31

+0

我有点像'vars(模块)',因为它与'globals()'类似 - 你找回字典,其余的都是一样的。否则,我想,味道的问题。 – kindall 2012-07-13 21:35:54

相关问题