2016-09-27 2 views
1

У меня есть базовый класс, который является singleton, мне нужно наследовать это в моем другом классе, но я получаю сообщение об ошибке как TypeError: Ошибка при вызове базовых метакласса function() аргумент 1 должен быть кодом, а не strКак наследовать базовый класс с singleton в python

Может кто-то помочь в этом. Ниже приведен пример кода.

def singleton(cls): 
    instances = {} 
    def getinstance(): 
    if cls not in instances: 
     instances[cls] = cls() 
    return instances[cls] 
    return getinstance 

@singleton 
class ClassOne(object): 

    def methodOne(self): 
    print "Method One" 

    def methodTwo(self): 
    print "Method Two" 


class ClassTwo(ClassOne): 
    pass 
+0

Я думаю, что вы создали проблему дизайна ... Singleton означает, где будет только один, если у вас есть производный класс, у вас будет несколько (2) экземпляров базового класса. Вы уверены, что вам нужен синглтон? –

+0

Так что 'locals()' не работает? – dsgdfg

+0

Необходимость ClassOne и ClassTwo оба являются singleton, classOne имеет функциональность ClassTwo и немного дополнительной поддержки, поэтому мне нужно использовать методы classOne вместо ClassTwo. изменение их во всем является существенное изменение, следовательно, хотел бы реализовать с помощью наследования – santosh

ответ

1

Вы должны сделать singleton собой класс вместо функции для деривации работать. Вот пример, который был протестирован на как Python 2.7 и 3.5:

class singleton(object): 
    instances = {} 
    def __new__(cls, clz = None): 
     if clz is None: 
      # print ("Creating object for", cls) 
      if not cls.__name__ in singleton.instances: 
       singleton.instances[cls.__name__] = \ 
        object.__new__(cls) 
      return singleton.instances[cls.__name__] 
     # print (cls.__name__, "creating", clz.__name__) 
     singleton.instances[clz.__name__] = clz() 
     singleton.first = clz 
     return type(clz.__name__, (singleton,), dict(clz.__dict__)) 

Если вы используете это с вашими например классы:

@singleton 
class ClassOne(object): 

    def methodOne(self): 
    print "Method One" 

    def methodTwo(self): 
    print "Method Two" 


class ClassTwo(ClassOne): 
    pass 

классов A и B оба будут Singletons

Остерегайтесь, это необычно наследовать от одноэлементного класса.

+0

Спасибо за это – santosh

Смежные вопросы