LINUX.ORG.RU

python + type


0

0

Почему type(str()) возвращает тип str а type(Z()) где Z - class вида

class Z: pass

возвращает instance? Что должно быть в классе чтобы type работала? пробовал переменную __name__, не оно.

Причем с "new classes" type показывает что-то осмысленное а с "old classes" показывает только instance.. Это так и должно быть?

dissident ★★
() автор топика
Ответ на: комментарий от dissident

Попробуй вместо type брать у экземпляра поле __class__

smartly ★★★
()

А зачем вам это понадобилось, если не секрет? Обычно для таких вещей используется isinstance.

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

> А зачем вам это понадобилось, если не секрет? Обычно для таких вещей
> используется isinstance.
Интересно мне. Любопытство. Погуглил немного и особо ничего не нашел, вроде новые типы надо как-то отдельно регистрировать? Но new style классы вроде показываются нормально.. Интересно зачем нужна такая функциональность и как ей пользоваться и почему для одних классов она работает, а для других нет.

Совет брать __class__ тоже хороший, но интересно а что же с type?

dissident ★★
() автор топика
Ответ на: комментарий от parser

muf@cocaine:~/zzzz$ cat z.py
#!/usr/bin/env python

print type(str)
print type(str())

class old_class:
        pass

print type(old_class)
print type(old_class())

class new_class(object):
        pass

print type(new_class)
print type(new_class())
muf@cocaine:~/zzzz$ ./z.py
<type 'type'>
<type 'str'>
<type 'classobj'>
<type 'instance'>
<type 'type'>
<class '__main__.new_class'>

Иными слоами типом объекта str является str, типом же объекта "нового"
класса (то есть такого который наследован от object) является что-то 
более иили менее осмысленное, типом же объектов всех старых классов 
является просто instance. Видимо поэтому и разница в типа класса 
(нового и встроенного vs старого), у нового и встроенного этот тип 
type, а у старого это тип classobj, более того следующий пример 
показывает что что встроенные типа вообще не являются классами но не 
проводит разницу в другом месте (здесь новые и старые классы ведут 
себя одинаково а встроенные методы нет):

#!/usr/bin/env python

import inspect

class old_class:
    def z(self):
        pass

class new_class(object):
    def z(self):
        pass

print inspect.ismethod(old_class.z)
print inspect.ismethod(new_class.z)
print inspect.ismethod(str.join)

print inspect.ismethod(old_class().z)
print inspect.ismethod(new_class().z)
print inspect.ismethod(str().join)


muf@cocaine:~/zzzz$ ./z.py
True
True
False
True
True
False


Как все это можно понять? Почему старые классы являются classobj'ами а
новые классы и встроенные типы являются type'ами, почему методы 
встроенных типов не являются методами?


Вот ответы на эти вопросы и интересуют меня из чистого любопытства, но
наверное это надо читать какую-нибудь очень толстую книгу, вот я и 
решил может быть здесь кто-нибудь знает?

dissident ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.