Python'un amacı __repr__


139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Bu yöntemin önemi / amacı nedir?


@ zjm1126: >>> variableNeyin __repr__()geri döndüğünü neden yazdırdığını bilmek ister misiniz ?
Esteban Küber

19
Bu dokümantasyon insanları uyutuyor. Ayrıca, bunun nasıl kullanıldığını başkalarından öğrenmek de yardımcı olur.
Concerned_Citizen


2
Python öğrenen Java geliştiricileri için, buna bakmanın en iyi yolu Java'daki toString () yöntemidir.
Ravi

Yanıtlar:


189

__repr__büyük olasılıkla bu nesneyi oluşturmak için olası yollardan biri olan nesnenin yazdırılabilir bir temsilini döndürmelidir . Buradaki resmi belgelere bakın . __repr__geliştiriciler için daha fazla __str__, son kullanıcılar içindir.

Basit bir örnek:

>>> 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)

2
tembel1: Öncelikle biçimlendirmeyi düzeltmek istedim (örneklerin örnek bir oturumda görecekleriyle mümkün olduğunca yakın eşleşmesi yararlıdır), ancak çıktı biçimini atamadan açıkça farklı olacak şekilde de değiştirdim. bununla karıştırılmış biri için netliği büyük ölçüde geliştirir, imho. (Çok ileri gidersem, yeniden düzenleyin ve size bir bira borçlu olacağım.)

2
Referansı atladı
S.Lott

1
Bu,% s yerine% r kullanmalıdır: stackoverflow.com/questions/6005159/…
Jonathan Adelson

43
Bu gerçekten doğru değil. __str__insan tarafından okunabilir olması beklenen çıktıdır: __repr__Python yorumlayıcısı için okunabilir bir temsil olduğu varsayılır (yani dizgiyi yorumlayıcıya beslemek nesneyi yeniden oluşturmalıdır). Ancak bir nesnenin __str__yöntemi yoksa , __repr__bunun yerine kullanılır. Ayrıca belirttiği gibi bu örnek aslında yazdırır __str__yöntemi self.xve self.y: %ryerine kullanılması gereken %sdize biçimlendirme işleminde (tanımlamıyor sınıf beri __str__, __repr__aslında zaten döndürülür, ancak bir anomalidir).
Daniel Andersson

20

Bu Python belgelerinde oldukça iyi açıklanmıştır :

repr ( object ): Bir nesnenin yazdırılabilir temsilini içeren bir dize döndürür. Bu, dönüşümlerden (ters tırnak) elde edilen değerle aynıdır. Bu işleme normal bir işlev olarak erişebilmek bazen yararlı olabilir. Birçok tür için bu işlev, iletildiğinde aynı değere sahip bir nesneyi verecek bir dize döndürme girişiminde bulunur eval(), aksi takdirde temsil, nesnenin türünün adını ek bilgilerle birlikte içeren açılı parantez içine alınmış bir dizedir genellikle nesnenin adı ve adresini içerir. Bir sınıf, bir __repr__()yöntem tanımlayarak bu işlevin örnekleri için ne döndürdüğünü denetleyebilir .

Burada gördüğünüz __repr__, serileştirme ve hata ayıklama için yararlı olan varsayılan uygulamasıdır .


5
Bence bir nesnenin "temsilini" elde etmek için ters tırnak (veya 'backticks') yöntemi kullanımdan kaldırıldı ve sürüm 3.0
MatrixFrog

MatrixFrog: her ikisi de doğru, ancak mevcut 2.x belgeleri hala bunu söylüyor, teklif burada.

Birçok nesne için __repr__ ve __str__ aynı işlevdir. Aslında, sadece __str__'yi tanımlarsanız, __repr__ varsayılan olarak sadece __str__'yi çağırır. Bunun doğru olmadığı en belirgin durum dizelerin kendisidir: str ('stackoverflow') döner stackoverflowancak repr ('stackoverflow') doğrudur 'stackoverflow'.
MatrixFrog

6
Bu geriye doğru, __repr__ asla __str__ kullanmaz, ama tersi olabilir. Bkz. Docs.python.org/reference/…

13

__repr__bağımsız Python yorumlayıcısı tarafından bir sınıfı yazdırılabilir biçimde görüntülemek için kullanılır. Misal:

~> 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__>

__str__Sınıfta bir yöntemin tanımlanmadığı durumlarda , __repr__yazdırılabilir bir gösterim oluşturma girişiminde işlevi çağırır .

>>> str(demo)
'<StackOverflow demo object __repr__>'

Ayrıca, print()sınıfın girilmesi __str__varsayılan olarak çağrılacaktır.


Belgeler , lütfen


7

__Repr__ yöntemi sadece bir sınıfın nesneleri yazdırmak için nasıl Python söyler


1

Aralarındaki farkları görmek için bir örnek ( bu kaynaktan kopyaladım ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

Getirileri repr()ve str()için aynıdır int x, fakat için dönüş değerleri arasında bir fark var str y- biridir biçimsel ve diğeri gayrı . Resmi ve gayri resmi sunumlar arasındaki en önemli farklardan biri, __repr__str değerinin varsayılan uygulamasının değerlendirme için bir argüman olarak çağrılabilmesi ve döndürülen değerin şu gibi geçerli bir dize nesnesi olabilmesidir:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Değerini döndürmek __str__için argüman olarak döndürmeye çalışırsanız , sonuç geçerli olmaz.


1

Sınıfları tanımlayarak yeni türler oluşturduğumuzda, yeni sınıfların kullanımını kolaylaştırmak için Python'un belirli özelliklerinden yararlanabiliriz. Bu özelliklerden biri, "sihirli yöntemler" olarak da adlandırılan "özel yöntemler" dir.

Özel yöntemlerin iki alt çizgi ile başlayan ve biten adları vardır. Onları tanımlıyoruz, ancak genellikle doğrudan isimle çağırmıyoruz. Bunun yerine, belirli koşullar altında otomatik olarak yürütülürler.

Print deyimini kullanarak bir nesnenin örneğinin değerini çıktılamak uygun olur. Bunu yaptığımızda, değerin çıktıda bazı anlaşılır belirsiz biçimlerde gösterilmesini isteriz. Repr Bunun böyle olması için özel bir yöntem düzenlemek için kullanılabilir. Bu yöntemi tanımlarsak, bu yöntemi tanımladığımız bir sınıf örneğinin değerini yazdırdığımızda otomatik olarak çağrılabilir. Bununla birlikte , eğer aynı zamanda tanımlamış olsaydık, benzer, ancak aynı olmayan bir amaç için kullanılan bir str özel yönteminin de olduğu belirtilmelidir.

Point3D sınıfı için repr yöntemini tanımlamamış ve my_point'i Point3D örneği olarak başlatmış ve sonra bunu yaparız ...

my_point'i yazdır ... bunu çıktı olarak görebiliriz ...

Çok hoş değil, ha?

Bu nedenle, daha iyi çıktı almak için repr veya str özel yöntemini veya her ikisini de tanımlıyoruz .

**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**

Çıktı ...

(1, 2, 3) (1, 2, 3)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.