2012-07-13 56 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

相關問題