Rozważ tę klasę:
class foo(object):
pass
Domyślna reprezentacja ciągu wygląda mniej więcej tak:
>>> str(foo)
"<class '__main__.foo'>"
Jak ustawić wyświetlanie niestandardowego ciągu?
Implementuj __str__()
lub __repr__()
w metaklasie klasy.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
Użyj, __str__
jeśli masz na myśli czytelne oznaczenie, użyj __repr__
do jednoznacznych reprezentacji.
_representation
do ciała klasy ireturn self._representation
w__repr__()
sposobie metaklasą.__repr__
reprezentacjiC
. Alternatywą dla posiadania_representation
członka jest utworzenie fabryki metaklasy, która produkuje metaklasę z odpowiednią__repr__
(może to być miłe, jeśli często z niej korzystasz).źródło
instances
klasę, a nie samą klasę.Jeśli musisz wybrać między pierwszym
__repr__
lub__str__
przejść do pierwszego, domyślnie__str__
wywołuje implementację,__repr__
gdy nie została zdefiniowana.Przykład niestandardowego Vector3:
W tym przykładzie
repr
ponownie zwraca ciąg, który może być bezpośrednio wykorzystany / wykonany, alestr
jest bardziej przydatny jako wyjście debugowania.źródło
__repr__
vs__str__
jest poprawne, to nie odpowiada na rzeczywiste pytanie, które dotyczy obiektów klasy, a nie instancji.Zatwierdzona odpowiedź Ignacio Vazquez-Abramsa jest całkiem słuszna. Jest jednak z generacji Python 2. Aktualizacja obecnego obecnie języka Python 3 będzie:
Jeśli chcesz, aby kod działał zarówno w Pythonie 2, jak i Pythonie 3, sześć modułów obejmuje:
Wreszcie, jeśli masz jedną klasę, w której chcesz mieć niestandardowe statyczne powtórzenie, powyższe podejście oparte na klasach działa świetnie. Ale jeśli masz kilka, musisz wygenerować metaklasę podobną do
MC
każdej z nich, a to może być męczące. W takim przypadku pójście o krok dalej i stworzenie fabryki metaklasy sprawi, że wszystko będzie trochę czystsze:drukuje:
Metaprogramowanie nie jest czymś, czego zwykle potrzebujesz na co dzień - ale kiedy tego potrzebujesz, naprawdę trafia w sedno!
źródło
Właśnie dodając do wszystkich dobrych odpowiedzi, moja wersja z dekoracją:
standardowe:
Wady:
C
bez superklasy (nieclass C:
)C
instancje będą instancjami o dziwnym pochodzeniu, więc prawdopodobnie dobrym pomysłem jest dodanie również__repr__
dla instancji.źródło