Получение имени модуля: x .__ module__ vs x .__ class __.__ module__ - PullRequest
5 голосов
/ 11 марта 2011

Я хочу получить модуль, из которого происходит объект Python. Оба

x.__module__

и

x.__class__.__module__

похоже на работу. Это полностью избыточно? Есть ли причина отдавать предпочтение одному другому?

1 Ответ

12 голосов
/ 11 марта 2011

Если x класс, то x.__module__ и x.__class__.__module__ дадут вам разные вещи:

# (Python 3 sample; use 'class Example(object): pass' for Python 2)
>>> class Example: pass

>>> Example.__module__
'__main__'
>>> Example.__class__.__module__
'builtins'

Для экземпляра, который не определяет __module__ напрямую, вместо него используется атрибут из класса.

>>> Example().__module__
'__main__'

Я думаю, вам нужно понять, о каком модуле вы на самом деле хотите знать. Если это модуль, содержащий определение класса, то лучше об этом явно заявить, поэтому я бы использовал x.__class__.__module__. Экземпляры обычно не записывают модуль, в котором они были созданы, поэтому x.__module__ может вводить в заблуждение.

...