Как узнать имя класса, который создал экземпляр объекта в Python, если функция, из которой я делаю это, является базовым классом, из которого был получен класс экземпляра?
Я думал, что модуль проверки мог бы помочь мне здесь, но, похоже, он не дает мне то, что я хочу. И если не считать анализа __class__
члена, я не уверен, как получить эту информацию.
Ответы:
Вы пробовали
__name__
атрибут класса? т.е.type(x).__name__
даст вам название класса, который я думаю, что вы хотите.Если вы все еще используете Python 2, обратите внимание, что приведенный выше метод работает только с классами нового стиля (в Python 3+ все классы являются классами "нового стиля"). Ваш код может использовать классы старого стиля. Следующее работает для обоих:
источник
dir(x.__class__)
не перечислить это?__class__
поtype
методу? Как так:type(x).__name__
. Разве призывать к двойному подчеркиванию не препятствует напрямую? Я не могу видеть, как обойти с помощью__name__
, хотя.__class__
напрямую, чтобы быть совместимым с классами старого стиля, так как их тип простоinstance
.def typename(x): return type(x).__name__
Вы хотите имя класса в виде строки?
источник
тип() ?
источник
self.__class__.__name__
вместо того,type(self).__name__
чтобы получить такое же поведение. Если естьtype()
функция, которую выполняет функция, о которой я не знаю?type(item)
элемент списка, результатом будет<type 'instance'>
времяitem.__class__.__name__
удержания имени класса.Приведенный выше пример кода (при вводе в интерактивном интерпретаторе) будет генерироваться
'__main__.A'
в отличие от того,'A'
который генерируется при__name__
вызове атрибута. Просто передавая результатA.__class__
вstr
конструктор, анализ обрабатывается для вас. Тем не менее, вы также можете использовать следующий код, если вы хотите что-то более явное.Такое поведение может быть предпочтительным, если у вас есть классы с одинаковыми именами, определенные в отдельных модулях.
Приведенный выше пример кода был протестирован в Python 2.7.5.
источник
Пример:
источник
Хороший вопрос.
Вот простой пример, основанный на GHZ, который может кому-то помочь:
источник
В качестве альтернативы вы можете использовать
classmethod
декоратор:Использование :
источник
Помимо захвата специального
__name__
атрибута, вам может понадобиться квалифицированное имя для данного класса / функции. Это делается путем захвата типов__qualname__
.В большинстве случаев они будут точно такими же, но при работе с вложенными классами / методами они отличаются в выводе, который вы получаете. Например:
Поскольку вам нужен самонаблюдение, вы всегда можете об этом подумать.
источник
__qualname__
это для Python 3.3+__qualname__
vs__name__
: stackoverflow.com/questions/58108488/what-is-qualname-in-pythonЧтобы получить имя класса экземпляра:
или
оба одинаковы
источник