我试图对Python的数据模型有更深入的了解,但我并不完全理解以下代码:
>>> x = 1
>>> isinstance(x,int)
True
>>> isinstance(x,numbers.Integral)
True
>>> inspect.getmro(int)
(<type 'int'>, <type 'object'>)
>>> inspect.getmro(numbers.Integral)
(<class 'numbers.Integral'>, <class 'numbers.Rational'>, <class 'numbers.Real'>,
<class 'numbers.Complex'>, <class 'numbers.Number'>, <type 'object'>)基于以上所述,int和number.Integral似乎不属于同一层次结构。
从Python引用(2.6.6)中我看到
numbers.Integral --它们代表整数的数学集合(正负)中的元素。
int和numbers.Integral有什么区别?这与我在上面的输出中看到的type int与class numbers.Integral有关吗?
发布于 2011-11-20 17:45:17
numbers定义了抽象类的层次结构,这些抽象类定义了数字类型上可能的操作。见佩普3141。int和Integral的区别在于,int是一种支持Integral定义的所有操作的具体类型。
发布于 2015-08-17 16:42:37
允许我添加两件事:
isinstance(x,numbers.Integral)还包括long和
isinstance(x, int)不会的。numbers.Integral测试将更接近于
isinstance(x, (int, long))在Python2中(Python3永久地杀死了long )。
我更喜欢用numbers.Integral进行测试,因为如果您从int (或long)派生,那么isinstance(y, numbers.Integral)仍然是True。
发布于 2019-11-14 14:55:51
int 已注册 as a 虚拟子类 of numbers.Integral.
# numbers.py:380 (CPython 3.8)
Integral.register(int)numbers.Integral是整数必须提供的抽象定义。int是整数的具体实现。
isinstance和issubclass函数不限于继承。例如,它们可以表示结构类型关系 (如collections.abc.Iterable )。
>>> class MyIterable:
... def __iter__(self): ...
...
>>> issubclass(MyIterable, collections.abc.Iterable)
True事实上,isinstance和issubclass都可以是每种类型都有更改。标准库使用它来定义抽象基类(ABC)支持具体子类(通过继承)和虚拟子类(通过cls.register(subclass))。
虚拟子类通过继承与其ABC无关--其方法解析顺序因此不使用ABC。具体来说,int不继承numbers.Integral的任何方法。但是,它确实独立地实现了numbers.Integral所需的所有公共方法和操作--从而满足了numbers.Integral定义。
https://stackoverflow.com/questions/8203336
复制相似问题