def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Jakie jest znaczenie / cel tej metody?
def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Jakie jest znaczenie / cel tej metody?
Odpowiedzi:
__repr__powinien zwrócić drukowalną reprezentację obiektu, najprawdopodobniej jeden z możliwych sposobów utworzenia tego obiektu. Zobacz oficjalną dokumentację tutaj . __repr__jest bardziej dla programistów, a __str__dla użytkowników końcowych.
Prosty przykład:
>>> class Point:
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __repr__(self):
... return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
__str__jest wyjściem, które powinno być czytelne dla człowieka: __repr__powinno być reprezentacją możliwą do odczytania dla interpretera Pythona (tzn. podanie ciągu do interpretera powinno odtworzyć obiekt). Jeśli jednak obiekt nie ma __str__metody, __repr__jest używany zamiast tego. Jak zauważono: ten przykład faktycznie wypisuje __str__metodę self.xand self.y: %rpowinno być użyte zamiast %sw operacji formatowania łańcucha (ponieważ klasa nie definiuje __str__, w __repr__rzeczywistości jest zwracana, ale jest to anomalia).
Jest to dość dobrze wyjaśnione w dokumentacji Pythona :
repr ( obiekt ): Zwraca ciąg zawierający drukowalną reprezentację obiektu. Jest to ta sama wartość, jaką dają konwersje (odwrotne cudzysłowy). Czasami warto mieć dostęp do tej operacji jako zwykłej funkcji. W przypadku wielu typów funkcja ta podejmuje próbę zwrócenia ciągu znaków, który dałby obiekt o tej samej wartości po przekazaniu do
eval(), w przeciwnym razie reprezentacja jest łańcuchem zamkniętym w nawiasach ostrych, który zawiera nazwę typu obiektu wraz z dodatkowymi informacjami często zawiera nazwę i adres obiektu. Klasa może kontrolować, co ta funkcja zwraca dla swoich instancji, definiując__repr__()metodę.
Widzisz tutaj domyślną implementację __repr__, która jest przydatna do serializacji i debugowania.
stackoverflowale repr ('stackoverflow') tak 'stackoverflow'.
__repr__jest używany przez samodzielny interpreter języka Python do wyświetlania klasy w formacie drukowalnym. Przykład:
~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
... def __init__(self):
... pass
... def __repr__(self):
... return '<StackOverflow demo object __repr__>'
...
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>
W przypadkach, gdy __str__metoda nie jest zdefiniowana w klasie, wywoła __repr__funkcję w celu utworzenia reprezentacji do druku.
>>> str(demo)
'<StackOverflow demo object __repr__>'
Ponadto print()klasa wywoła __str__domyślnie.
Dokumentacja , proszę
Metoda __repr__ po prostu mówi Pythonowi, jak drukować obiekty klasy
Przykład pokazujący różnice między nimi (skopiowałem z tego źródła ),
>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
Zwroty z repr()i str()są identyczne dla int x, ale istnieje różnica między wartościami zwracanymi dla str y- jedna jest formalna, a druga nieformalna . Jedną z najważniejszych różnic między reprezentacjami formalnymi i nieformalnymi jest to, że domyślną implementację __repr__wartości str można wywołać jako argument funkcji eval, a wartość zwracana byłaby prawidłowym obiektem typu string, na przykład:
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
Jeśli spróbujesz wywołać zwracaną wartość __str__jako argument do eval, wynik nie będzie prawidłowy.
Kiedy tworzymy nowe typy, definiując klasy, możemy skorzystać z pewnych funkcji Pythona, aby uczynić nowe klasy wygodniejszymi w użyciu. Jedną z tych cech są „metody specjalne”, zwane również „metodami magicznymi”.
Metody specjalne mają nazwy zaczynające się i kończące dwoma podkreśleniami. Definiujemy je, ale zwykle nie nazywamy ich bezpośrednio po imieniu. Zamiast tego są wykonywane automatycznie w określonych okolicznościach.
Wygodne jest, aby móc wyprowadzić wartość wystąpienia obiektu za pomocą instrukcji print. Gdy to robimy, chcielibyśmy, aby wartość była reprezentowana w wyniku w jakimś zrozumiałym i jednoznacznym formacie. Repr sposób szczególny mogą być wykorzystane do zorganizowania tak się stało. Jeśli zdefiniujemy tę metodę, może ona zostać wywołana automatycznie, gdy wydrukujemy wartość wystąpienia klasy, dla której zdefiniowaliśmy tę metodę. Należy jednak wspomnieć, że istnieje również specjalna metoda str , używana w podobnym, ale nie identycznym celu, która może mieć pierwszeństwo, jeśli ją również zdefiniujemy.
Jeśli nie zdefiniowaliśmy metody repr dla klasy Point3D i utworzyliśmy instancję my_point jako instancję Point3D, a następnie robimy to ...
wypisz my_point ... możemy zobaczyć to jako wynik ...
Niezbyt ładne, co?
Dlatego definiujemy specjalną metodę repr lub str lub obie, aby uzyskać lepszy wynik.
**class Point3D(object):
def __init__(self,a,b,c):
self.x = a
self.y = b
self.z = c
def __repr__(self):
return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
def __str__(self):
return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**
Wynik ...
(1, 2, 3) (1, 2, 3)
Zaimplementuj repr dla każdej implementowanej klasy. Nie powinno być wymówki. Zaimplementuj str dla klas, o których myślisz, że czytelność jest ważniejsza niż niejednoznaczność.
Skorzystaj z tego linku: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
>>> variabledrukuje to, co__repr__()zwraca?