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__
?
Есть ли причина предпочесть тот или иной?
(В моем случае я хочу использовать его для определения имени журнала, но я думаю, это не имеет значения)
Ответы
Ответ 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__()
.