Специальные методы класса 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 UnicodeDecodeError при написании немецких букв

Google App Engine, среда выполнения Python 2.7, ImportError: невозможно импортировать имя djangoforms

регулярные выражения python возвращают true / false

Определить группы непрерывных чисел в списке

Функция вызова Python с пользовательского ввода

Django ManyToMany отношения с абстрактной базой – невозможно, но есть ли лучший способ?

Python logging.Formatter (): есть ли способ исправить ширину поля и оправдать его влево / вправо?

Как запустить скрипт Python с одним щелчком значка?

Лучшая практика для установки значения по умолчанию для параметра, который должен быть списком в Python?

Как добавить еженедельные timedeltas в отношении летних часов

Головоломка: сколько способов вы можете поразить цель лазерным лучом в четырех отражающих стенах

Как создать раскрывающееся меню, которое появляется на основе ответа из другого выпадающего меню

Как ускорить этот код Python?

Python Google App Engine Получение строки вместо объекта JSON

Как установить другой заголовок Inline в Django Admin?

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