哪里存储了Python中int实例的int值?

时间:2015-12-03 12:16:22

标签: python attributes integer

python中的int类型提供了两个名为numeratorreal的属性,其内容与__int__()相同。

由于所有这三个值都返回相同的内部属性,我猜real是一个属性,如:

@property
def real(self):
   return self.__int

但是我在IPython中找不到这个隐藏属性目录dira = int(); a._int__<tab>

所以我看了source code并发现了这个:

static PyGetSetDef int_getset[] = {
    {"real",
     (getter)int_int, (setter)NULL,
     "the real part of a complex number",
     NULL},
    {"imag",
     (getter)int_get0, (setter)NULL,
     "the imaginary part of a complex number",
     NULL},
    {"numerator",
     (getter)int_int, (setter)NULL,
     "the numerator of a rational number in lowest terms",
     NULL},
    {"denominator",
     (getter)int_get1, (setter)NULL,
     "the denominator of a rational number in lowest terms",
     NULL},
    {NULL}  /* Sentinel */
};

而且:

static PyObject *
int_int(PyIntObject *v)
{
    if (PyInt_CheckExact(v))
        Py_INCREF(v);
    else
        v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
    return (PyObject *)v;
}

但这是我能自己走的最远的。

整数的实际值是存储在整数实例中的吗?

这个问题的主要原因是我想用float来扩展MyFloat类型,我希望引用该实例的值。

1 个答案:

答案 0 :(得分:2)

实际的整数值在ob_ival。本质上,int_int只是从一个int对象获取整数值并将其包装在另一个对象中。

不确定为什么你看不到这些属性。如果我运行它,它们会出现在我的2.7和3.4版本中:

x = 8
dir(x)

编辑: 在评论中太难解释,所以加入答案。

您可以像这样轻松地对其进行子类化:

class foo(int):
    def __getitem__(self):
        return self + 1

foo(8).__getitem__()

您也可以使用super以这种方式显式访问int对象。

(你确实知道__getitem__用于键控对象[类似于dict],因此通常会得到第二个指定键的参数,对吧?int和{{1}没有键入。)