Допустим, вы определяете класс:
class MyClass:
def __str__(self):
return str(self.__class__)
При попытке напечатать этот класс, посмотрите, что вы получите:
>>> instance = MyClass()
>>> print(instance)
__main__.MyClass
это происходит потому, что строка версия класса включает в себя модуль, который он определен. в этом случае, определяются в модуле, который в настоящее время исполняется, оболочки, поэтому он показывает, как __main__.MyClass
. Если мы используем self.__class__.__name__
, однако:
class MyClass:
def __str__(self):
return self.__class__.__name__
instance = MyClass()
print(instance)
выводит:
MyClass
Атрибут класса __name__
не включает в себя модуль.
Примечание: Атрибут __name__
дает имя, первоначально присвоенное классу. Все копии будут содержать имя. Например:
class MyClass:
def __str__(self):
return self.__class__.__name__
SecondClass = MyClass
instance = SecondClass()
print(instance)
выход:
MyClass
Это потому, что атрибут __name__
определяется как часть определения класса. Использование SecondClass = MyClass
просто назначает другое имя классу. Он никоим образом не изменяет класс или его имя.
Взгляните на [Что в мире есть атрибут «__class__» в python] (http://stackoverflow.com/questions/8060751/what-in-the-world-is-the-attribute-class- in-python) –
i все готово смотреть на него – robert