编号模块中的ABC类别编号

时间:2019-06-22 17:44:23

标签: python python-2.7 abc isinstance

创建ABC类以检查对象类型,因此无法实例化它们。实际上:

basestring()

抛出:

TypeError: The basestring type cannot be instantiated

但是,对于ABC号码却不会发生这种情况:

from numbers import number

number()

它不会引发任何异常。而来自同一模块的其他ABC则:

from numbers import Real
from numbers import Complex

Real()  # or Complex()

抛出:

TypeError: Can't instantiate abstract class Real with abstract methods __abs__, __add__, __div__, __eq__, __float__, __floordiv__, __le__, __lt__, __mod__, __mul__, __neg__, __pos__, __pow__, __radd__, __rdiv__, __rfloordiv__, __rmod__, __rmul__, __rpow__, __rtruediv__, __truediv__, __trunc__

那是为什么?

1 个答案:

答案 0 :(得分:1)

看看source for the numbers module会提供答案:

class Number(metaclass=ABCMeta):
    """All numbers inherit from this class.
    If you just want to check if an argument x is a number, without
    caring what kind, use isinstance(x, Number).
    """
    __slots__ = ()

    # Concrete numeric types must provide their own hash implementation
    __hash__ = None

如您所见,numbers.Number类具有abc.ABCMeta作为元类。并且由于它没有用@ab.cabstractmethod@abc.abstractclassmethod@abc.abstractstaticmethod装饰的方法,因此abc.ABCMeta类不会阻止实例化。

另一方面,类numbers.Realnumbers.Complex继承自numbers.Number并用@abc.abstractmethod装饰许多方法,因此无法实例化它们。

这意味着numbers.Number很有可能只是因为它是Python中抽象类的工作方式而已,而不是因为有人专门将其构建成这样。