调用super()时必须是type not instance错误

时间:2015-10-25 23:58:32

标签: python python-2.7 oop singleton

我的问题是,当我调用 isSearchQueryValid()并因此 super()时出现此错误:

must be type, not instance

我已经发现它与旧/新类风格有关但是当我结合抽象方法,工厂和单身时我感到有点困惑,不知道什么是什么。你能指点一下这个错误吗?

from abc import ABCMeta, abstractmethod, abstractproperty
from Singleton import *

class TorrentSiteFactory():    
    @staticmethod
    def Create(site):
        if site == "MySite": return MySite.GetInstance()

class Site(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def getSearchQueryLink(self): pass

    @abstractmethod
    def isSearchQueryValid(self, searchQuery, categories = None):
        '''Returns True if SearchQuery is ok, False when there are some errors. Additionally returns list of errors and warnings'''

        return True

@Singleton
class MySite(Site):
    def getList(self, searchQuery):
        searchLink = self.getSearchQueryLink(searchQuery)

    def getSearchQueryLink(self, searchQuery):
        searchQueryIsCorrect = self.isSearchQueryValid(searchQuery, self.Categories)
        if searchQueryIsCorrect: return "www.somelink.com"
        return None

    def isSearchQueryValid(self, searchQuery, categories):
        return super(MySite, self).isSearchQueryValid(searchQuery, categories) 

这是Singleton:

class Singleton():
    def __init__(self, decorated):
        self._decorated = decorated

    def GetInstance(self):
        try:
            return self._instance
        except AttributeError:
            self._instance = self._decorated()
            return self._instance

    def __call__(self):
        raise TypeError('Singletons must be accessed through `Instance()`.')

    def __instancecheck__(self, inst):
        return isinstance(inst, self._decorated)

1 个答案:

答案 0 :(得分:0)

您的Singleton实施非常糟糕。当你这样做

@Singleton
class MySite(Site):
    ...

MySite不是您定义的类。这是Singleton的一个实例。它没有MySite的任何方法,而super(MySite, self)找不到要查看的MRO。如果不完全重写,你必须非常重视Singleton

此外,SingletonTorrentSiteFactory是经典类,因为您忘记继承object