当前位置: 首页 > 面试题库 >

抽象类和PyMongo; 无法实例化抽象类

田化
2023-03-14
问题内容

我创建了一个空的抽象类,AbstractStorageStorage从中继承了该类:

import abc
import pymongo as mongo

host = mongo.MongoClient()

print(host.alive()) # True

class AbstractStorage(metaclass=abc.ABCMeta):
    pass

class Storage(AbstractStorage):
    dbh = host
    def __init__(self):
        print('__init__')

Storage()

我期望输出是

True
__init__

但是,我得到的是

True
Traceback (most recent call last):
  File "/home/vaultah/run.py", line 16, in <module>
    Storage()
TypeError: Can't instantiate abstract class Storage with abstract methods dbh

如果我删除metaclass=abc.ABCMeta(这样AbstractStorage就变成一个普通的类)和/或如果我设置dbh了其他值,问题(显然)就消失了。

这里发生了什么?


问题答案:

这实际上不是ABC的问题,而是PyMongo的问题。有一个关于它的问题在这里。似乎pymongo重写__getattr__以返回某种数据库类。这意味着将host.__isabstractmethod__返回一个数据库对象,该对象在布尔上下文中为true。这使ABCMeta认为这host是一种抽象方法:

>>> bool(host.__isabstractmethod__)
True

问题报告中描述的解决方法是host.__isabstractmethod__ = False在对象上手动设置。关于这个问题的最后评论表明,已经为pymongo 3.0修复了问题。



 类似资料:
  • 所以我有两个类。一个只有纯粹的虚拟函数。另一个实现了这些函数,并从第一个类派生出来。我知道我不能实例化第一个类。但是当我试图创建第二个类的对象时,它也失败了。 我的第二节课大体上是这样的: 执行: 下面是我如何实例化它并得到错误: 我哪里做错了? 第一课

  • 第一次来这里。我是C新手,花了好几个小时想弄明白这个问题。很抱歉问一个似乎很常见的问题。我一生都找不到答案。 我在visual studio中遇到以下编译错误: 我的理解是,这意味着我创建的纯虚拟函数尚未在子类中实现。据我所见,它已在intNode子节点中实现。我做错了什么?代码如下。提前谢谢! 在节点中。h: 在Node.cpp: 编辑...对不起,我忘了添加这个位。错误指向main中的此部分

  • 我查过了,发现最接近的是这个,除了我没有任何向前的声明。我在基类中只有一个纯虚函数,我在子类中实现它,如下所示: 命令H 命令cpp 数字H 数字cpp 发生文件错误: 一个dd.cpp 添加H

  • 问题内容: 我得到了几种解释,但是到目前为止,我还无法理解Java中的抽象类和方法是什么。 有人说它必须与程序的安全性做些关系,另一些人说不是那样。 即使从Dietel&Dietel的书中,我也不明白它的目的。我们何时,何地,为什么使用它? 请像您正在教初学者一样进行解释,非常感谢您的帮助。 问题答案: 抽象类是无法实例化的类。唯一的目的是扩展其他类。 抽象方法是抽象类中的方法(必须声明为抽象),

  • 本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗