Подтвердить что ты не робот

Python: self.__ class__ vs. type (self)

Мне интересно, есть ли разница между

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

и

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

?

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

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

4b9b3361

Ответ 1

>>> 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

Ответ 2

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

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