我的问题是,当我调用 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)
答案 0 :(得分:0)
您的Singleton
实施非常糟糕。当你这样做
@Singleton
class MySite(Site):
...
MySite
不是您定义的类。这是Singleton
的一个实例。它没有MySite
的任何方法,而super(MySite, self)
找不到要查看的MRO。如果不完全重写,你必须非常重视Singleton
。
此外,Singleton
和TorrentSiteFactory
是经典类,因为您忘记继承object
。