Что такое простая служебная функция, позволяющая различать класс или объект Python старого типа и нового стиля

Какая простая служебная функция, позволяющая различать класс или объект Python старого и нового стиля?

Являются ли следующие правильными / полными:

isNewStyle1 = lambda o: isinstance(hasattr(o, '__class__') and o.__class__ or o, type)
isNewStyle2 = lambda o: hasattr(o, '__class__') and type(o) == o.__class__ or False

Если нет, то можете ли вы предоставить решение? Если так, есть ли лучший способ сделать проверку?

Используя вышеизложенное, у меня не было никаких проблем, но я не уверен на 100%, что это будет работать для всех объектов, представленных в качестве параметров.

2 ответа

Как насчет:

class A: pass

class B(object): pass


def is_new(myclass):
    try: myclass.__class__.__class__
    except AttributeError: return False
    return True

>>> is_new(A)
False
>>> is_new(B)
True
>>> is_new(A())
False
>>> is_new(B())
True
>>> is_new(list())
True

Почему не просто

type(my_class) is type

True для новых классов стилей, False для классических занятий

Вы можете поддерживать классы с разными метаклассами, например так (если метакласс имеет тип подкласса)

issublass(type(myclass), type)
Другие вопросы по тегам