2012-02-09 4 views
7

Я понимаю, следующий код Python:Python: __str__, но для класса, а не для экземпляра?

>>> class A(object): 
...  def __str__(self): 
...   return "An instance of the class A" 
... 
>>> 
>>> a = A() 
>>> print a 
An instance of the class A 

Теперь я хотел бы изменить вывод

>>> print A 
<class '__main__.A'> 

Какую функцию мне нужно перегружать, чтобы быть в состоянии сделать это? Решение должно работать, даже если класс никогда не создается. Является ли ситуация другой в Python 2.x и 3?

+0

Вы [проверено] (http://stackoverflow.com/search?q= [питон] +% 2Bclass +% 2Bstr и представить = поиск) для существующих ответы перед тем, как спросить? –

+0

Возможный дубликат [Как определить метод __str__ для класса?] (Http://stackoverflow.com/questions/8144026/how-to-define-a-str-method-for-a-class) –

+0

Я пробовал , но на самом деле его не нашли. – user1199915

ответ

10

Определение __str__() на метакласса:

class A(object): 
    class __metaclass__(type): 
     def __str__(self): 
      return "plonk" 

Теперь print A напечатает plonk.

Редактировать: Как было отмечено jsbueno в комментариях, в Python 3.x вам нужно будет сделать следующее:

class Meta(type): 
    def __str__(self): 
     return "plonk" 
class A(metaclass=Meta): 
    pass 

Даже в Python 2.x это может быть лучшей идеей, чтобы определить метакласса вне тела класса - я выбрал вложенную форму выше, чтобы сохранить некоторую типизацию.

+1

Поскольку O.P. спрашивает о совместимости с Python 3, он должен знать, что Python 3 не поддерживает эту форму назначения метакласса, поскольку «метакласс» передается так, как если бы он использовал параметр ключевого слова в объявлении класса. (так что метаклас должен быть определен перед телом класса) – jsbueno

+0

@jsbueno: Спасибо, пропустил этот вопрос. –

+0

У вас [отмечен] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & submit = поиск) для дубликатов перед ответом? –

6

Определение метода __repr__ на вашем мета классе:

class MetaClass(type): 

    def __repr__(self): 
      return "Customized string" 

class TestClass(object): 
    __metaclass__ = MetaClass 


print TestClass # Customized string 
Смежные вопросы