2010-07-19 4 views
1

Это то, что я до сих пор:Как получить конкретное название ссылки класса в Python

def get_concrete_name_of_class(klass): 
"""Given a class return the concrete name of the class. 

klass - The reference to the class we're interested in. 
""" 

# TODO: How do I check that klass is actually a class? 
# even better would be determine if it's old style vs new style 
# at the same time and handle things differently below. 

# The str of a newstyle class is "<class 'django.forms.CharField'>" 
# so we search for the single quotes, and grab everything inside it, 
# giving us "django.forms.CharField" 
matches = re.search(r"'(.+)'", str(klass)) 
if matches: 
    return matches.group(1) 

# Old style's classes' str is the concrete class name. 
return str(klass) 

Так это работает просто отлично, но мне кажется, Обратите внимание, что я не могу просто сделать klass().__class__.__name__ (не могу иметь дело с args и т. д.).

Также, кто-нибудь знает, как выполнить TODO (например, проверьте, является ли klass классом и является ли его стиль старого стиля новым стилем)?

Любые предложения были бы весьма признательны.

На основе комментариев вот что я закончил с:

def get_concrete_name_of_class(klass): 
    """Given a class return the concrete name of the class. 

    klass - The reference to the class we're interested in. 

    Raises a `TypeError` if klass is not a class. 
    """ 

    if not isinstance(klass, (type, ClassType)): 
     raise TypeError('The klass argument must be a class. Got type %s; %s' % (type(klass), klass)) 

    return '%s.%s' % (klass.__module__, klass.__name__) 
+0

Это надуманное и глупое. Функции 'type' и' issubclass' расскажут вам все, что вы просите. Почему бы не использовать их? –

+0

@ S.Lott: Извините, если вы считаете, что это было надуманно и глупо. И 'type' и' issubclass' не скажут мне полный путь к классу, что было моим главным вопросом. – sdolan

+0

Что значит «полный путь»? –

ответ

2

Как насчет использования klass.__name__, или получить полное имя, klass.__module__+'.'+klass.__name__?

+0

Благодарим вас за технику.:) – sdolan

2

Вы можете просто сказать

klass.__module__ + "." + klass.__name__ 

А как определить то, является ли старый класс или новый класс, я рекомендую сказать что-то вроде

from types import ClassType # old style class type 

if not isinstance(klass, (type, ClassType)): 
    # not a class 
elif isinstance(klass, type): 
    # new-style class 
else: 
    # old-style class 
+0

+1: Спасибо за проверку старого стиля против нового стиля. – sdolan

1
>>> class X: 
...  pass 
... 
>>> class Y(object): 
...  pass 
... 

Функция типа говорит вам если имя - это класс, а стиль старого стиля - новый.

>>> type(X) 
<type 'classobj'> 
>>> type(Y) 
<type 'type'> 

Он также сообщает вам, что представляет собой объект.

>>> x= X() 
>>> type(x) 
<type 'instance'> 
>>> y= Y() 
>>> type(y) 
<class '__main__.Y'> 

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

>>> issubclass(y.__class__,object) 
True 
>>> issubclass(x.__class__,object) 
False 
>>> 
Смежные вопросы