Найти - Пользователи
Полная версия: isinstance() и типы.
Начало » Python для новичков » isinstance() и типы.
1 2
I159
Решаю задачу: выбрать из модуля все объекты и отфильтровать только классы.
>>> import ex
>>> x = dir(ex)
>>> for i in x:
... f = getattr(ex, i)
... if isinstance(f, classobj):
... d = f
... print d
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
NameError: name 'classobj' is not defined
Проверил тип:
>>> import ex
>>> x = dir(ex)
>>> type(getattr(ex, x[3])
... )
<type 'classobj'>
Какой должен быть идентификатор, чтобы isinstance выдала True для класса? (не нашел идентификаторы типов)
Vader
Как-то так
>>> class test(object):
... pass
...
>>> class test2:
... pass
...
>>> test3 = test()
>>> test4 = test2()
>>> issubclass(test, object)
True
>>> issubclass(test2, object)
False
>>> issubclass(test3, object)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
>>> issubclass(test4, object)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
regall
I159, почитайте про классы нового и старого стиля. Вы уже второй вопрос за сегодня на эти грабли наступаете. У классов старого стиля - тип classobj, у классов нового стиля тип - type.
Vader
Кстати, еще так можно
>>> class test(object):
... pass
...
>>> class test2:
... pass
...
>>> test3 = test()
>>> test4 = test2()
>>> import inspect
>>> inspect.isclass(test)
True
>>> inspect.isclass(test2)
True
>>> inspect.isclass(test3)
False
>>> inspect.isclass(test4)
False
doza_and
Вопрос является-ли объект классом подразумевает наличие некоторой “концепции” - что есть класс. Поскольку в питоне в качестве основного декларируется утиный принцип, то проверять тип несколько странно. Класс это тот кто удовлетворяет некоторой “концепции”. Например hasattr(a,“__dict__”) есть истина (это пример, некоторые классы могут не иметь __dict__).
Поэтому вопрос.
Уважаемые питонеры, подскажите где описаны стандартные “концепции” питона как то
Классы
итераторы
отображения
множества
множества с прямым доступом
может еще что-то?
В документации это есть - но неявно, без полного перечня концепциий и требуемых свойств для них.
I159
regall, с новыми и старыми классами немного разобрался - спасибо. Сделал такую проверку:
>>> class NewClass(object):
... pass
...
>>> class OldClass:
... pass
...
>>> isinstance(NewClass, type)
True
>>> isinstance(OldClass, classobj)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'classobj' is not defined
>>> t = type(OldClass)
>>> t
<type 'classobj'>
>>> isinstance(OldClass, t)
True
Мне не понятно, почему когда я ввел тип classobj, он выдает ошибку, а когда то же значение получено методом type(), то возвращает True?
regall
I159
Мне не понятно, почему когда я ввел тип classobj, он выдает ошибку, а когда то же значение получено методом type(), то возвращает True?
Потому что classobj находится в модуле new.
>>> import new
>>>
>>> class X:
>>> pass
>>>
>>> type(X) == new.classobj
True
I159
Спасибо, теперь стало яснее.
Vader
regall
Потому что classobj находится в модуле new.
Только использовать этот модуль не нужно. Нужно использовать types
>>> import types
>>> types.ClassType
<type 'classobj'>
I159
Vader, в чем различия?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB