Специальные методы класса Python (не экземпляр)

Как переопределить специальный метод класса?

Я хочу иметь возможность вызвать метод __str__() класса без создания экземпляра. Пример:

 class Foo: def __str__(self): return 'Bar' class StaticFoo: @staticmethod def __str__(): return 'StaticBar' class ClassFoo: @classmethod def __str__(cls): return 'ClassBar' if __name__ == '__main__': print(Foo) print(Foo()) print(StaticFoo) print(StaticFoo()) print(ClassFoo) print(ClassFoo()) 

производит:

 <class '__main__.Foo'> Bar <class '__main__.StaticFoo'> StaticBar <class '__main__.ClassFoo'> ClassBar 

должно быть:

 Bar Bar StaticBar StaticBar ClassBar ClassBar 

Даже если я использую метод @staticmethod или @classmethod __str__ все еще использует встроенное определение Python для __str__ . Он работает только тогда, когда Foo().__str__() вместо Foo.__str__() .

3 Solutions collect form web for “Специальные методы класса Python (не экземпляр)”

Специальный метод __str__ определенный в классе, работает только для экземпляров этого класса, чтобы иметь другое поведение для объектов класса, которое вам нужно будет делать в метаклассе этого класса, например (python 2.5)

 class Meta(type): def __str__(self): return "Klass" class A(object): __metaclass__ = Meta def __str__(self): return "instance" print A print A() 

вывод:

 Klass instance 

Почему вы хотите злоупотреблять смыслом __str__ ? Этот метод зарезервирован для значения «вернуть строковое представление этого экземпляра ».

Если вам нужна функция, которая возвращает статическую строку, было бы лучше иметь ее как отдельную функцию, не входящую в класс.

Если вы хотите, чтобы конструктор возвращал новую строку, назовите ее чем-то другим, чтобы она не сбила зарезервированное имя __str__ .

Я точно не знаю, что вы пытаетесь сделать. Позвольте мне добавить немного случайной информации.

Во-первых, добавьте этот класс:

 class FooNew(object): def __str__(self): return 'Fubar' 

Распечатайте это вместо:

 if __name__ == '__main__': print "You are calling type for an old style class" print(Foo) print(type.__str__(Foo)) print(Foo()) print("But my Python 2.6 didn't match your output for print(Foo)") print("You are calling object.str() for a new style class") print(FooNew) print(object.__str__(FooNew)) print(FooNew()) print("Why do you want to change this?") 

Чтобы получить это:

 You are calling type for an old style class __main__.Foo <class __main__.Foo at 0xb73c9f5c> Bar But my Python 2.6 didn't match your output for print(Foo) You are calling object.str() for a new style class <class '__main__.FooNew'> <class '__main__.FooNew'> Fubar Why do you want to change this? 

Вы абсолютно уверены, что не хотите называть класс?

 
Interesting Posts for Van-Lav

Безглавой браузер для Python (поддержка Javascript НЕОБХОДИМА!)

Многопроцессорность Python занимает гораздо больше времени, чем одиночная обработка

Группа Панда и сумма

Улучшение качества преобразования Wand

Пассивный массив в N кусков с помощью Numpy

Получить полную трассу

pyspark EOFError после вызова карты

Ли ' +' equal '(a | b) +' в модуле python re?

Python: Matplotlib аннотирует разрыв строки (с латексным и без него)

python – sklearn Скрытое преобразование распределения Дирихле против Fittransform

Подпись GPG в памяти (или, возможно, использование временной брелка)

Различные результаты с векторизованным кодом в стандартный цикл в numpy

Потерял важный .py-файл (перезаписан в виде 0-байтного файла), но старая версия все еще загружена в IPYTHON в качестве модуля – может ли она быть восстановлена?

Выберите имена столбцов в таблице, используя PyODBC

Python – настройка цвета фона на прозрачный в сюжетных графиках

Python - лучший язык программирования в мире.