Почему методы в стандартной библиотеке Python можно вызывать как функции?

Я обнаружил странное явление: некоторые методы в стандартной библиотеке Python можно вызывать как функции. Например, есть метод randint(), определенный в классе Random в модуле random.py. Насколько я понимаю, когда мы хотим его вызвать, мы должны сначала импортировать модуль random, а затем объявить экземпляр класса Random, чтобы метод randint() можно было вызвать, например

import random as rd
aaa = rd.Random()
aaa.randint()

Но я только что обнаружил, что randint() можно вызвать как функцию и нет необходимости делать, как указано выше:

import random as rd
rd.randint()

Вот мне и интересно, как происходит это нелогичное явление?

Почему методы в стандартной библиотеке Python можно вызывать как функции?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Заглянув в random.py, мы видим, что фактически создается экземпляр, а его методы экспортируются как функции уровня модуля. В этом нет ничего волшебного.

Комментарий там прекрасно это описывает:

# Create one instance, seeded from current time, and export its methods
# as module-level functions.  The functions share state across all uses
# (both in the user's code and in the Python libraries), but that's fine
# for most programs and is easier for the casual user than making them
# instantiate their own Random() instance.

_inst = Random()
# .. SNIP ..
randint = _inst.randint

Другие модули стандартной библиотеки используют другой, но похожий подход к экспорту функций уровня модуля. Например. модуль re использует внутреннюю функцию _compile() для создания локального экземпляра Pattern и позволяет ему выполнять всю работу (строка документации опущена для краткости):

def search(pattern, string, flags=0):
    return _compile(pattern, flags).search(string)

Мы можем заключить, что не существует общего механизма для повышения уровня методов до функций уровня модуля. Это просто удачный дизайн интерфейса со стороны отдельных модулей.

Привет, Фридрих! Большое вам спасибо, ваш ответ действительно имеет смысл!

Yongji Wen 26.04.2024 04:13

Другие вопросы по теме