2012-04-30 2 views
48

мне интересно, если есть разница междуPython: само .__ class__ против типа (Я)

class Test(object): 
    def __init__(self): 
     print self.__class__.__name__ 

и

class Test(object): 
    def __init__(self): 
     print type(self).__name__ 

?

Есть ли причина предпочесть тот или иной?

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

+5

Возможный дубликат [Разница между типом (obj) и объектом. \ _ \ _ Class \ _ \ _] (http://stackoverflow.com/questions/1060499/difference-between-typeobj-and-obj-class) – user

+0

@ пользователь и есть разница между ними в Python 3 при определенных обстоятельствах (см. [ответ] Flavien (http://stackoverflow.com/a/10633356/704244)) –

ответ

31
>>> class Test(object): pass 
>>> t = Test() 
>>> type(t) is t.__class__ 
True 
>>> type(t) 
__main__.Test 

Так что эти два одинаковые. Я бы использовал self.__class__, так как это более очевидно, что это такое.

Однако type(t) не будет работать для классов старого стиля, так как тип экземпляра класса старого стиля является instance в то время как тип экземпляра класса нового стиля является его класс:

>>> class Test(): pass 
>>> t = Test() 
>>> type(t) is t.__class__ 
False 
>>> type(t) 
instance 
+9

Действительно? Вы получите доступ к 'self .__ class__' над' type (self) '? Я думаю, что последнее более ясное, менее типичное и более последовательное - я сомневаюсь, что вы сделаете '[1, 2, 3] .__ len __()' over 'len ([1, 2, 3])'. –

+9

Ну 'len()' говорит вам, что он делает, но 'type (self)' не сразу говорит вам 'дает вам класс " – ThiefMaster

+5

Прошлые ранние версии Python, Type и Class являются синонимами в Python, поэтому я думаю На самом деле я этого не вижу. –

4

Насколько мне известно, последний просто красивый способ сделать то бывший.

Это на самом деле не так уж необычно в Python, рассмотрим repr(x), который просто вызывает x.__repr__() или len(x), который просто вызывает x.__len__(). Python предпочитает использовать встроенные функции для общих функций, которые вы, вероятно, будете использовать в разных классах, и обычно реализует их, вызывая методы __x__().

Смежные вопросы