类型错误:'dict'对象无法使用 OrderedDict 和多重继承进行调用



遵循具有多重继承和字典类的代码,它给出了这个神秘的错误:

'dict' object is not callable

但只是第二次我打电话给dump_settings(),而不是第一次。

这个'dict'和什么关系?

from collections import OrderedDict
from abc import ABC, abstractmethod
class Dumpable(ABC):
def __init__(self):
self.dump_settings = None
super().__init__()
def dump_settings(self, settings ):
self.dump_settings = settings
pass

class ItemSet(OrderedDict, Dumpable):
def __init__(self , allow_substitution : bool = False ):
super(OrderedDict, self).__init__()
super(Dumpable,  self).__init__()
# also substituting two calls above with the
# following, do not change behavior:
# super().__init__()
self.allow_substitution = allow_substitution
pass
def dump_settings(self,settings):
super().dump_settings(settings)
pass
itemset = ItemSet()
output = open("output.txt", "w", encoding="utf-8")
d= dict( output = output , html = False )
print(repr(d))
# this call seems to have no problems:
itemset.dump_settings(d)
print(repr(d))
# note that the given error "'dict' object is not callable"
# has nothing to do with 'd' param because if you change
# in the followin the 'd' with a non-dictionary object,
# the error remains, for example:
# itemset.dump_settings('hello')
itemset.dump_settings(d)
output.close()

注意:该错误与d变量无关(这也是一个dictionary(,因为如果使用非字典对象更改它,错误仍然存在,例如:

itemset.dump_settings('hello')

我尝试了Python版本3.5.2 for linux3.8.3 for Windows

问题是你正在用字典替换你的dump_settings方法,所以当你下次去调用dump_settings时,它现在是一个字典而不是一个方法,就像错误说"dict"不可调用一样。

请记住,方法只是类的属性。所以在创建项集对象之后。itemset.dump_settings属性指向该方法。但是,当您致电dump_settings时。然后你继续做self.dump_settings=设置(其中设置是你给它的字典(。所以现在itemset.dump_settings是一个字典而不是一种方法。

print(f"itemset.dump_settings, type: {type(itemset.dump_settings)}, {itemset.dump_settings}")
itemset.dump_settings(d)
print(f"itemset.dump_settings, type: {type(itemset.dump_settings)}, {itemset.dump_settings}")

输出

itemset.dump_settings, type: <class 'method'>, <bound method ItemSet.dump_settings of ItemSet()>
itemset.dump_settings, type: <class 'dict'>, {'output': <_io.TextIOWrapper name='output.txt' mode='w' encoding='utf-8'>, 'html': False}

如果要保存字典,则需要在类中为其指定一个名称,该名称还不是方法的名称。

def dump_settings(self, settings):
self.dump_settings_dict = settings

找到的解决方案,非常简单:

存在冲突,因为Dumpable类中,dump_settings它既是类变量又是方法名。

重命名其中一个,解决了问题。

相关内容

  • 没有找到相关文章

最新更新