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?
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?
Yanıtlar:
__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)
__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).
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 .
stackoverflowancak repr ('stackoverflow') doğrudur 'stackoverflow'.
__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
__Repr__ yöntemi sadece bir sınıfın nesneleri yazdırmak için nasıl Python söyler
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.
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)
Uygulamak repr uygulamak her sınıf için. Bahane olmamalı. Okunabilirliğin belirsizliğin daha önemli olduğunu düşündüğünüz sınıflar için str uygulayın .
Bu bağlantıya bakın: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
>>> variableNeyin__repr__()geri döndüğünü neden yazdırdığını bilmek ister misiniz ?