gpt4 book ai didi

python - 使用 super() 调用重载方法会产生 AttributeError

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:12 26 4
gpt4 key购买 nike

我有一个类定义,例如

from tinydb import TinyDB

class DB(TinyDB):
def __init__(self, filename):
return super(DB, self).__init__(filename)

def exists(self, url):
return bool(self.search(Entry.url == url))

def insert(self, *args, **kwargs):
if len(self) > 100:
self.purge_tables()

return super(DB, self).insert(*args, **kwargs)

哪里TinyDB is from the tinydb package .

当我现在尝试运行时

database = db.DB('test.json')
database.insert({'title': 'Hello', 'url': 'foo'})

我收到一条错误消息

return super(DB, self).insert(*args, **kwargs)
AttributeError: 'super' object has no attribute 'insert'

而当我这样做时

from tinydb import TinyDB

database2 = TinyDB('test.json')
database2.insert({'title': 'Hello', 'url': 'foo'})

insert() 就在那里,provided by

def __getattr__(self, name):
"""
Forward all unknown attribute calls to the underlying standard table.
"""
return getattr(self._table, name)

这种使类中一个属性的属性可供外部访问的方法似乎有些复杂。

最佳答案

您的最后一个示例之所以有效,是因为 TinyDB 上定义了 __getattr__ 方法:

class TinyDB(object):
# [....]
def __getattr__(self, name):
"""
Forward all unknown attribute calls to the underlying standard table.
"""
return getattr(self._table, name)

事实上,insert 方法是在 Table 上定义的。您可以使用以下方法修复您的示例:

def insert(self, *args, **kwargs):
if len(self) > 100:
self.purge_tables()

return self._table.insert(*args, **kwargs)

this answer有更多关于为什么它不像您期望的那样工作的解释。

关于python - 使用 super() 调用重载方法会产生 AttributeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37832661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com