Как определить, является ли переменная классом или объектом - PullRequest
3 голосов
/ 26 ноября 2009

Я работаю на немного более низком уровне и пишу небольшую платформу для создания тестовых приспособлений для моего проекта на Python. В этом я хочу выяснить, является ли конкретная переменная экземпляром определенного класса или самим классом, и если это класс, я хочу знать, является ли это подклассом определенного класса, определенного моей структурой. Как мне это сделать?

class MyBase(object):
    pass

class A(MyBase):
    a1 = 'Val1'
    a2 = 'Val2'

class B(MyBase):
    a1 = 'Val3'
    a2 = A

Я хочу выяснить, являются ли свойства a1 и a2 экземплярами класса / типа (a1 является строковым типом в B) или самим объектом класса (то есть a2 является A в B). Не могли бы вы помочь мне, как мне это узнать?

Ответы [ 4 ]

11 голосов
/ 26 ноября 2009

Используйте модуль проверки .

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

Например, функция inspect.isclass() возвращает true, если объект является классом:

>>> import inspect
>>> inspect.isclass(inspect)
False
>>> inspect.isclass(inspect.ArgInfo)
True
>>> 
4 голосов
/ 26 ноября 2009

Используйте isinstance и type, types.ClassType (что для классов старого стиля):

>>> isinstance(int, type)
True

>>> isinstance(1, type)
False
3 голосов
/ 26 ноября 2009

Используйте функцию type(). Он вернет тип объекта. Вы можете получить «фондовые» типы для сравнения из библиотеки types . Классы старого стиля (которые ни от чего не наследуют) имеют тип types.ClassType. Классы нового стиля, как в вашем примере, имеют тип types.TypeType. В этом модуле есть много других полезных типов для строк и тому подобного.

Вызов type() для экземпляра класса старого стиля возвращает types.InstanceType. Вызов этого экземпляра класса нового стиля возвращает сам класс.

1 голос
/ 26 ноября 2009

Используйте тип ()

>>> class A: pass
>>> print type(A)
<type 'classobj'>
>>> A = "abc"
>>> print type(A)
<type 'str'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...