Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2011 19:47:51

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

Решаю задачу: выбрать из модуля все объекты и отфильтровать только классы.

>>> 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 для класса? (не нашел идентификаторы типов)



Офлайн

#2 Апрель 11, 2011 20:05:39

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

Как-то так

>>> 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



Офлайн

#3 Апрель 11, 2011 20:08:11

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

isinstance() и типы.

I159, почитайте про классы нового и старого стиля. Вы уже второй вопрос за сегодня на эти грабли наступаете. У классов старого стиля - тип classobj, у классов нового стиля тип - type.



Офлайн

#4 Апрель 11, 2011 20:17:08

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

Кстати, еще так можно

>>> 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



Отредактировано (Апрель 11, 2011 20:17:35)

Офлайн

#5 Апрель 11, 2011 20:41:45

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

isinstance() и типы.

Вопрос является-ли объект классом подразумевает наличие некоторой “концепции” - что есть класс. Поскольку в питоне в качестве основного декларируется утиный принцип, то проверять тип несколько странно. Класс это тот кто удовлетворяет некоторой “концепции”. Например hasattr(a,“__dict__”) есть истина (это пример, некоторые классы могут не иметь __dict__).
Поэтому вопрос.
Уважаемые питонеры, подскажите где описаны стандартные “концепции” питона как то
Классы
итераторы
отображения
множества
множества с прямым доступом
может еще что-то?
В документации это есть - но неявно, без полного перечня концепциий и требуемых свойств для них.



Офлайн

#6 Апрель 11, 2011 22:01:41

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

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?



Офлайн

#7 Апрель 11, 2011 22:11:44

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

isinstance() и типы.

I159
Мне не понятно, почему когда я ввел тип classobj, он выдает ошибку, а когда то же значение получено методом type(), то возвращает True?
Потому что classobj находится в модуле new.
>>> import new
>>>
>>> class X:
>>> pass
>>>
>>> type(X) == new.classobj
True



Офлайн

#8 Апрель 11, 2011 22:19:04

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

Спасибо, теперь стало яснее.



Офлайн

#9 Апрель 11, 2011 22:20:37

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

regall
Потому что classobj находится в модуле new.
Только использовать этот модуль не нужно. Нужно использовать types
>>> import types
>>> types.ClassType
<type 'classobj'>



Офлайн

#10 Апрель 11, 2011 22:29:09

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

isinstance() и типы.

Vader, в чем различия?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version