Питон - статьи

         

Настройка вывода класса на печатающее устройство


>
>
>
class Printable(type): ... def __str__(cls): ... return "This is class %s" % cls.__name__ ... >
>
>
class C(object): __metaclass__ = Printable ... >
>
>
print C # equivalent to print Printable.__str__(C) This is class C >
>
>
c = C() >
>
>
print c # equivalent to print C.__str__(c) <C object at 0x40380a6c>

Эту ситуацию можно представить с помощью следующей диаграммы:





Рис. 3. Метаклассы и магические методы



Из предыдущего обсуждения ясно, что метод .__str__() в Printable не может заменить метод .__str__() в C, который наследуется из object и, следовательно, обладает приоритетом; печать C по-прежнему дает стандартный результат.

Если бы C наследовал свой метод .__str__() из Printable, а не из object, это породило бы проблему: у экземпляров C нет атрибута .__name__, и печать C сгенерировала бы ошибку. Разумеется, вы по-прежнему могли бы определить метод .__str__() в C, что изменило бы то, как печатается C.



Содержание раздела