遵循具有多重继承和字典类的代码,它给出了这个神秘的错误:
'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 linux
和3.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
它既是类变量又是方法名。
重命名其中一个,解决了问题。