python-3.x 无法用抽象方法示例化抽象类...

qv7cva1a  于 2022-11-26  发布在  Python
关注(0)|答案(3)|浏览(145)

我正在写一个lib,由于一个奇怪的原因,我出现了这个错误。

  • Here是我代码。当然 *@abc.abstractmethod必须取消注解 *
  • 这是我的测试
  • 抱歉不能复制粘贴 *

我是基于下面的代码工作。
第1001章:我的test.py:

import abc
import six

@six.add_metaclass(abc.ABCMeta)
class Base(object):

    @abc.abstractmethod
    def whatever(self,):
        raise NotImplementedError

class SubClass(Base):

    def __init__(self,):
    
        super(Base, self).__init__()
        self.whatever()

    def whatever(self,):
        print("whatever")

Python壳中:

>>> from test import *
>>> s = SubClass()
whatever

为什么我的 * 花名册 * 模块我有这个错误:

Can't instantiate abstract class Player with abstract methods _Base__json_builder, _Base__xml_builder

先谢谢你。

2nbm6dog

2nbm6dog1#

你的问题是因为你在你的基础抽象类中定义了带有__(双下划线)前缀的抽象方法,这会导致python在定义类的时候进行名字修改。
函数的名称从__json_builder更改为_Base__json_builder,或者从__xml_builder更改为_Base__xml_builder,这是您必须在子类中实现/覆盖的名称。
要在示例中显示此行为-

>>> import abc
>>> import six
>>> @six.add_metaclass(abc.ABCMeta)
... class Base(object):
...     @abc.abstractmethod
...     def __whatever(self):
...             raise NotImplementedError
...
>>> class SubClass(Base):
...     def __init__(self):
...             super(Base, self).__init__()
...             self.__whatever()
...     def __whatever(self):
...             print("whatever")
...
>>> a = SubClass()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class SubClass with abstract methods _Base__whatever

当我将实现更改为以下内容时,它可以正常工作

>>> class SubClass(Base):
...     def __init__(self):
...             super(Base, self).__init__()
...             self._Base__whatever()
...     def _Base__whatever(self):
...             print("whatever")
...
>>> a = SubClass()
whatever

但是这是非常乏味的,你可能要考虑一下你是否真的想用__(双下划线)定义你的函数。

u59ebvdq

u59ebvdq2#

要使它的行为与Python 2中一样,最简单的方法是使用

exec('print("your code")', globals())

这将允许您的代码访问导入,代码中定义的类和函数将正常工作,等等。
此操作应仅使用您信任的代码执行。

t2a7ltrp

t2a7ltrp3#

我得到了下面相同的错误:
TypeError:无法使用抽象方法声音示例化抽象类Animal
当我试图示例化**Animal抽象类**时,如下所示:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        print("Wow!!")

obj = Animal() # Here
obj.sound()

而且,我得到了下面同样的错误:
TypeError:无法使用抽象方法声音示例化抽象类Cat
当我没有覆盖**Cat中的sound()抽象方法时,我示例化了Cat类**,如下所示:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        print("Wow!!")

class Cat(Animal):
    pass # I didn't override "sound()" abstract method

obj = Cat() # Here
obj.sound()

因此,我重写了**Cat中的sound()抽象方法**,然后示例化了**Cat类**,如下所示:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        print("Wow!!")

# I overrided "sound()" abstract method
class Cat(Animal):
    def sound(self):
        print("Meow!!")

obj = Cat() # Here
obj.sound()

然后,我可以解决这个错误:

Meow!!

相关问题