Питон: сам. класс против типа (self) [дубликат]
этот вопрос уже есть ответ здесь:
Разница между типом (obj) и obj.__класс__
3 ответы
мне интересно, есть ли разница между
class Test(object):
def __init__(self):
print self.__class__.__name__
и
class Test(object):
def __init__(self):
print type(self).__name__
?
есть ли причина предпочесть одно или другое?
(в моем случае использования я хочу использовать его чтобы определить имя регистратора, но я думаю, что это не имеет значения)
2 ответов:
>>> 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
насколько мне известно, последнее-это просто более приятный способ сделать первое.
Это на самом деле не так уж необычно в Python, считать
repr(x), который просто называетx.__repr__()илиlen(x), который просто называетx.__len__(). Python предпочитает использовать встроенные модули для общих функций, которые вы, вероятно, будете использовать в диапазоне классов, и обычно реализует их путем вызова__x__()методы.
Comments