2012-05-24 3 views
1

Что такое простая функция утилиты, чтобы различать класс или объект 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% уверенности в том, что он будет работать для всех объектов, поставляемых в качестве параметров.

+0

'isNewStyle = lambda x: hasattr (x," __weakref __ ")' Просто выберите функцию, которую имеют классы нового стиля, но классы старого стиля этого не делают. –

ответ

0

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

type(my_class) is type 

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

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

issublass(type(myclass), type) 
+0

Что касается только классов, я пытаюсь учесть любой объект, например, type (list()) является списком, так что это приведет к отказу вашего теста. – Cyrus

+0

Затем my_class = type (list()). Просто выполните этот тест для типа любого произвольного объекта. –

+0

@Cyrus, Волшебная попытка поддержать экземпляры и классы - плохая идея. Учтите, что класс _is_ an_instance_ of 'type' (обычно). –

1

Как насчет:

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