作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果你打开 random.py
看看它是如何工作的,它的类 Random
是 _random.Random
的子类:
import _random
class Random(_random.Random):
"""Random number generator base class used by bound module functions.
Used to instantiate instances of Random to get generators that don't
share state. Especially useful for multi-threaded programs, creating
a different instance of Random for each thread, and using the jumpahead()
method to ensure that the generated sequences seen by each thread don't
overlap.
Class Random can also be subclassed if you want to use a different basic
generator of your own devising: in that case, override the following
methods: random(), seed(), getstate(), setstate() and jumpahead().
Optionally, implement a getrandbits() method so that randrange() can cover
arbitrarily large ranges.
"""
我可以通过以下操作轻松找到文件 random.py
:
In [1]: import sys
In [2]: print random.__file__
/usr/lib/python2.7/random.pyc
然而 _random
没有这个变量:
In [3]: _random.__file__
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-295-a62b7df330e2> in <module>()
----> 1 _random.__file__
AttributeError: 'module' object has no attribute '__file__'
那么什么是_random
,random
为什么要继承它,在哪里可以找到它对应的文件?
最佳答案
在 C 中实现的模块使用前导下划线是一种常见的做法。通常是模式 _mod
对于这个 C 模块和 mod
对于导入此 _mod
的 Python 模块用来。您会在标准库的几个模块中找到它。通常,您应该使用 mod
而不是 _mod
.
在 Mac OS X 上有一个文件:
_random.so
在 Python 使用的共享库目录中。
只需在交互式提示符下键入模块名称即可查看路径:
>>> _random
>>> <module '_random' from '/path/to/python/sharedlibs/_random.so'>
顺便说一句,并非所有您可以导入的模块都有与之关联的文件。有些是 Python 可执行文件的一部分,内置模块:
>>> import sys
>>> sys.builtin_module_names
('_ast', '_codecs', '_collections', '_functools', '_imp', '_io', '_locale',
'_operator', '_signal', '_sre', '_stat', '_string', '_symtable', '_thread',
'_tracemalloc', '_warnings', '_weakref', 'atexit', 'builtins', 'errno',
'faulthandler', 'gc', 'itertools', 'marshal', 'posix', 'pwd', 'sys',
'time', 'xxsubtype', 'zipimport')
因此,如果您进入您的平台:
>>> _random
_random <module '_random' (built-in)>
比_random
是 Python 可执行文件本身的一部分。
在C源中_randommodule.c你可以找到Random
的方法可在 Python 中使用:
static PyMethodDef random_methods[] = {
{"random", (PyCFunction)random_random, METH_NOARGS,
PyDoc_STR("random() -> x in the interval [0, 1).")},
{"seed", (PyCFunction)random_seed, METH_VARARGS,
PyDoc_STR("seed([n]) -> None. Defaults to current time.")},
{"getstate", (PyCFunction)random_getstate, METH_NOARGS,
PyDoc_STR("getstate() -> tuple containing the current state.")},
{"setstate", (PyCFunction)random_setstate, METH_O,
PyDoc_STR("setstate(state) -> None. Restores generator state.")},
{"getrandbits", (PyCFunction)random_getrandbits, METH_VARARGS,
PyDoc_STR("getrandbits(k) -> x. Generates an int with "
"k random bits.")},
{NULL, NULL} /* sentinel */
};
比较:
>>> [x for x in dir(_random.Random) if not x.startswith('__')]
['getrandbits', 'getstate', 'jumpahead', 'random', 'seed', 'setstate']
关于python - python的_random是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41473958/
我是一名优秀的程序员,十分优秀!