2013-02-05 6 views
0

나는 python 클래스를 instansiate하는 함수를 사용하고 있습니다.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 

이름은 내 DB에 존재하는 모든 클래스를 instansiate 수있는 방법을 가르쳐주세요.

+0

obj''무엇입니까? 클래스의 인스턴스입니까? – Bakuriu

+0

예 모델 클래스의 인스턴스 – masterofdestiny

+0

클래스 내부에 클래스로 '싱글 톤'을 쓰는 이유는 무엇입니까? 또한'__new__'가 잘못 들여 쓰여 있거나 정말로'Singleton'이 아닌'SMSMrg'의 일부입니까? – Bakuriu

답변

0

오류가 .

당신은 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을 구축 할 수 있도록 필요하므로 중 하나는 클래스가 DB에 끝낼 수있는 미리 알고 또는이 방법을 사용할 수 없습니다.

CLASS_NAMES_TO_CLASSES이 아니고은 문자열을 문자열로 매핑하는 사전입니다. 문자열을 클래스 객체에 매핑합니다. 모듈에서 SomeClass 클래스를 가져 오면 사전에 넣어야합니다.

다른 방법으로는 eval을 사용하여 클래스 이름을 평가할 수 있지만 안전하지 않은 사용자의 데이터가 db에 포함되어있는 경우이 문제를 방지해야합니다.

이 유용하다는 것은 클래스 이름을 저장하지 않고 대신 pickle을 사용하여 인스턴스를 직접 저장하는 것입니다.

+0

업데이트를 확인하십시오. 같은 것을 얻고 있습니다. – masterofdestiny

+0

@masterofdestiny 당신은 내가 여기 보여준 것을하지 않습니다. 나는 내 뜻을 명확하게하기 위해 나의 대답을 업데이트 할 것이다. – Bakuriu

+0

감사합니다 기다리고 fr ur 대답 – masterofdestiny

1

줄에 줄로 cla = str(SERVIVEPROVIDER) 줄에. 당신이 cla 당신이 호출로 사용할 수 없음을 의미하는 클래스의 이름을 포함 말했듯이 그리고 당신이 그것을 호출하려고 다음 줄에, 그래서 당신은 ...

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')() 
관련 문제