2012-02-09 12 views
7

Rozumiem następujący kod Python:Python: __str__, ale dla klasy, a nie instancji?

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

Teraz chciałbym zmienić wyjście

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

która funkcja muszę przeciążać, aby móc to zrobić? Rozwiązanie musi działać, nawet jeśli klasa nigdy nie jest tworzona. Czy sytuacja różni się w Pythonie 2.x i 3?

+0

byłaś [zaznaczone] (http://stackoverflow.com/search?q= [Python] +% 2Bclass +% 2Bstr & submit = wyszukiwania) dla istniejących odpowiedzi przed pytaniem? –

+0

możliwy duplikat [Jak zdefiniować metodę __str__ dla klasy?] (Http://stackoverflow.com/questions/8144026/how-to-define-a-str-method-for-a-class) –

+0

Próbowałem , ale tak naprawdę jej nie znalazłem. – user1199915

Odpowiedz

10

Definiowanie __str__() na metaklasą:

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

Teraz print A wypisze plonk.

Edit: Jak zauważył jsbueno w komentarzach, w Pythonie 3.x trzeba by wykonać następujące czynności:

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

Nawet w Pythonie 2.x to może być lepszy pomysł, aby określić metaclass poza ciałem klasy - wybrałem powyższy formularz zagnieżdżony, aby zaoszczędzić trochę pisania.

+1

Ponieważ O.P. pyta o kompatybilność z Pythonem 3, należy zauważyć, że Python 3 nie obsługuje tej formy przypisywania metaklasy, ponieważ "metaclass" jest przekazywany tak, jakby był tam, gdzie parametr słowa kluczowego w deklaracji klasy. (tak, metaklasa musi być zdefiniowana przed ciałem klasy) – jsbueno

+0

@jsbueno: Dzięki, przegapiłem to pytanie. –

+0

Czy [sprawdziłeś] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & submit = search) dla duplikatów przed odpowiedzią? –

6

Określ metodę __repr__ na meta klasy:

class MetaClass(type): 

    def __repr__(self): 
      return "Customized string" 

class TestClass(object): 
    __metaclass__ = MetaClass 


print TestClass # Customized string 
Powiązane problemy