2013-02-05 82 views
0

我正在使用函數來實例化python類。Python:TypeError:'str'對象不可調用

赫斯是類結構

from DB.models import ApiKey,ServiceProvider 

class SMSMrg(object): 
    _instance = None 
    class Singleton: 
     def __init__(self): 
      self.username = None 
      self.password = None 
      self.allsp = [] 
      self.classnames = {} 
    def __new__(cls, *args, **kwargs): 
     if not cls._instance: 
      cls._instance = super(SMSMrg, cls).__new__(
           cls, *args, **kwargs) 
     return cls._instance 

    def loadsettings(self): 

     get_all_sp = ServiceProvider.objects.filter(status = False) 
     for (options,obj) in enumerate(get_all_sp): 
      cla = str(obj.class_Name) 
      self.classnames[cla] = cla 
     print self.classnames 

     for (options,obj) in enumerate(get_all_sp): 
      cla = str(obj.class_Name) 
      class_object = self.classnames[cla](obj.userName,obj.password,obj.sendingurl) 

     # self.allsp = get_all_sp 
    def send(self): 
     print "+++++++++++++++++++== Global send " 


if __name__ == "__main__": 

    b = SMSMrg() 
    b.loadsettings() 

我已存儲在數據庫中的類名和我已經定義在不同的文件中的每個類的結構。

cla將包含類名稱。

但是,當我在上面調用函數時,我得到了類型錯誤。

Traceback (most recent call last): 
    File "allsms.py", line 30, in <module> 
    b.loadsettings() 
    File "allsms.py", line 21, in loadsettings 
    class_object = cla(obj.userName,obj.password,obj.sendingurl) 
TypeError: 'str' object is not callable 

請告訴我如何instaniate所有類名稱存在於我的分貝。

+0

什麼是'obj'?它是這個類的一個實例嗎? – Bakuriu

+0

是的,它是模型類的實例 – masterofdestiny

+0

爲什麼你將'Singleton'作爲一個類寫入類中?還有'__new__'嚴重縮進或者它真的是'SMSMrg'的一部分,而不是'Singleton'? – Bakuriu

回答

0

正如你所說cla包含類的名字,這意味着你不能使用它作爲一個可調用。

您可以構建一個dict並從那裏類對象:

from somemodule import SomeClass 

class TheClass(object): 
    def __init__(self, username, password, url): 
     #do stuff 

class AnOtherClass(object): 
    def __init__(self, username, password, url): 
     # do stuff 

CLASS_NAMES_TO_CLASSES = { 
    # Note: TheClass is *not* a string, is the class!!! 
    'FirstName': TheClass, 
    'SecondName': AnOtherClass, 
    'SomeClass': SomeClass, 
    } 

class SMSMrg(object): 
    #do stuff 
    def loadsettings(self): 
     get_all_sp = ServiceProvider.objects.filter(status = True) 
     for obj in get_all_sp: 
      SERVIVEPROVIDER = obj.class_Name 
      cla = str(SERVIVEPROVIDER) 
      class_object = CLASS_NAMES_TO_CLASSES[cla](obj.userName,obj.password,obj.sendingurl) 

這種方法需要您能夠建立這樣一個dict,所以無論你提前知道哪些類可以在數據庫中結束或者你不能使用這種方法。

請注意CLASS_NAMES_TO_CLASSES而不是字典將字符串映射到字符串。它將字符串映射到類對象。如果從模塊中導入類SomeClass,則必須將其放入字典中。

其他方法可能是使用eval來評估類名,但如果db包含來自用戶的數據(這是不安全的),則應該避免這種情況。

可能變成有用的其他選項是避免保存類名,而是使用pickle直接保存實例。

+0

請檢查更新,我會得到相同的 – masterofdestiny

+0

@masterofdestiny你是*不*做我在這裏展示的。我會更新我的答案,使我的意思更清晰。 – Bakuriu

+0

謝謝等待我的回答 – masterofdestiny

1

在線cla = str(SERVIVEPROVIDER)您將SERVIVEPROVIDER轉換爲字符串。而你試圖調用它的下一行,這樣你會得到一個錯誤...

1
# Means `cla` is pointing to a string 
cla = str(SERVIVEPROVIDER) 

# there is no function called `cla` now it contains a string 
cla(obj.userName,obj.password,obj.sendingurl) 
0

Please tell me how can instansiate all the classes which names are present in my db .

試試這個:

class A(object): pass 
class B(object): pass 

class_names = {'first': A, 'second': B} 
obj = class_names['first']() 
type(obj) 
<class 'yourmodule.A'> 

或者,如果你的類存儲在別處,說一個模塊在一個名爲mymodule

import mymodule 
obj = getattr(mymodule, 'A')()