![](/img/trans.png)
[英]TypeError: super(type, obj): obj must be an instance or subtype of type. Error when calling super after metaclass creation
[英]Must be type not instance error when calling super()
我的问题是,当我调用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)
这是单例:
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)
您的Singleton
实现非常糟糕。 当你做
@Singleton
class MySite(Site):
...
MySite
不是您定义的类。 这是Singleton
的一个实例。 它没有MySite
任何方法,并且super(MySite, self)
找不到要查找的MRO。 如果没有完全重写,则必须对Singleton
很大的更改。
另外, Singleton
和TorrentSiteFactory
是经典类,因为您忘记了从object
继承。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.