2009-11-26 3 views
3

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

class MyBase(object): 
    pass 

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

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

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

+0

Почему вы не можете прочитать источник? Что случилось с вашим источником? –

+0

Что это значит? Вы имеете в виду, что я должен прочитать исходный код, проанализировать его и узнать? Я хочу узнать программно и динамически во время выполнения. Как я могу достичь этого, читая исходный код? –

ответ

11

Используйте inspect module.

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

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

>>> import inspect 
>>> inspect.isclass(inspect) 
False 
>>> inspect.isclass(inspect.ArgInfo) 
True 
>>> 
+0

+1 Не знал об этом, намного лучше, чем альтернативы 'isinstance' – abyx

+0

Большое спасибо. Я тоже об этом не знал. Помогает мне много. Я использую комбинацию этого и решение, получаемое с помощью inklesspen и abyx. Спасибо всем за решение –

3

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

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

4

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

>>> isinstance(int, type) 
True 

>>> isinstance(1, type) 
False 
1

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

>>> class A: pass 
>>> print type(A) 
<type 'classobj'> 
>>> A = "abc" 
>>> print type(A) 
<type 'str'> 
Смежные вопросы