python中的int
类型提供了两个名为numerator
和real
的属性,其内容与__int__()
相同。
由于所有这三个值都返回相同的内部属性,我猜real
是一个属性,如:
@property
def real(self):
return self.__int
但是我在IPython中找不到这个隐藏属性目录dir
或a = 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
类型,我希望引用该实例的值。
答案 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}没有键入。)