__Arasındaki fark__ __Python__ Xi str
Python __str__
__repr__
arasındaki fark nedir?
CEVAP
Alex iyi özetlenebilir ancak, şaşırtıcı bir şekilde, çok kısa ve öz oldu.
İlk olarak, bana Alex sonrası ana noktaları tekrar edeyim:
- Varsayılan uygulama işe yaramaz (sabit, ama evet olmaz bir düşünün)
- 6* *hedef net
- 7* *gol okunabilir
- Kap
__str__
bulunan nesneleri’__repr__
kullanır
Varsayılan uygulama bir işe yaramaz
Bu Python öntanımlı ayarları oldukça yararlı olma eğilimindedir, çünkü çoğunlukla bir sürpriz oldu. Gibi davran ki: ancak, bu durumda, __repr__
için bir varsayılan sahip
return "%s(%r)" % (self.__class__, self.__dict__)
çok tehlikeli olmuştur (örneğin, sonsuz özyineleme içine almak çok kolay eğer nesneleri referans birbirimizi). Dışarı Python polisler. __repr__
tanımlanmış ve __str__
değilse, nesne __str__=__repr__
sanki davranır. gerçek olan bir varsayılan olduğunu unutmayın:
Bunun anlamı, basit bir dille: sen uygulamak nesneyi anlamak için kullanılabilir __repr__
bir işlevsel olmalıdır hemen hemen her nesne. __str__
uyguluyor isteğe bağlı: eğer bir “baskı” (örneğin, rapor jeneratör tarafından kullanılan) işlevi. çok ihtiyacın varsa bunu
__repr__
hedefi net
Bana doğru söyle bakalım — hata olduğuna inanmıyorum. Gerçekten herhangi bir hata ayıklayıcı kullanmak için nasıl bilmiyorum, ve hiç bir zaman ciddiye kullanmış. Ayrıca, hata büyük hata temel doğası olduğuna inanıyorum — ben hata ayıklama hataları çoğu uzun zaman önce bir uzun, bir galaksinin çok uzakta oldu. Bu, dini şevk ile, günlüğü inanıyorum anlamına gelir. Oturum yangın ve unut server iyi herhangi bir sistemin can damarı. Belki bazı özel ambalajı, tüm ihtiyacınız olan bir proje . Python kolay oturum açmak için yapar:
log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)
Ama son adımı her uygulamaya yararlı bir Xi, böyle bir kodu sadece çalışabilmesi için nesne emin olun. Bu yüzden” şey gelir: eğer her şeyi biliyorsun demektir eval(repr(c))==c
, yeteri kadar bilgi varsa c
hakkında bilinmesi gereken “eval Eğer o olmazsa, en azından bulanık bir şekilde yap. Eğer, c
hakkında yeterli bilgiye zaten sahip olduğunuzdan emin olun. Ben genellikle eval gibi bir format kullanın: "MyClass(this=%r,that=%r)" % (self.this,self.that)
. O demek değil olabilir aslında inşa Sınıfım, ya da bu hakkı yapıcı argümanlar — ama yararlı bir form express “bu her şeyi bilmek bu örneği”.
Not: %r
yukarıda %s
kullandım. Sen her zaman __repr__
uygulama içinde repr()
[veya %r
karakter biçimlendirmesini kullanır] kullanmak istiyor, ya da Xi amacı yenerek. MyClass(3)
MyClass("3")
ayırt etmek mümkün olmak istiyorum.
__str__
amacı okunabilir
Özellikle, anlaşılır olması amaçlanmıştır — str(3)==str("3")
dikkat edin. Size bir IP soyutlama, str gibi olan uygulamaya benzer şekilde, 192.168.1.1 gayet iyi. Zaman soyut bir tarih/uygularken, str olabilir "2010/4/12 15:35:22", vb. Amaç, bir kullanıcı, bir programcı değil, okumak istemezdi bir şekilde temsil etmektir. İşe yaramaz basamak kesip, başka bir sınıf gibi — uzun okunabilirlik desteklediği için, bu da bir gelişme.
Kap __str__
bulunan nesneleri kullanır’ __repr__
Bu şaşırtıcı görünüyor, değil mi? Okunabilir olur biraz, ama
[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]
? Çok değil. Özellikle, bir kap içinde dizeleri çok kolay dize gösterimine rahatsız bulur. Belirsizlik karşısında, unutma, Python tahmin cazibesine karşı koyar. Eğer bir liste yazdırırken yukarıdaki davranış istiyorsanız, sadece
print "[" ", ".join(l) "]"
(belki de sözlük hakkında ne yapacağımıza karar verebilirsiniz.
Özet
Herhangi bir sınıf için __repr__
uygulamak uygulamak. Bu ikinci doğa olmalıdır. Eğer okunabilirliği daha fazla belirsizlik lehine daha fazla yan tarafında hataları olan bir dize sürümü için yararlı olacağını düşünüyorsanız __str__
uygulamak.
__Getattr arasındaki fark__ vs __getat...
' __GÜZEL_FONKSİYON__, __arasında...
__init__ __arasındaki fark python__ de...
__Arasında herhangi bir fark__ ve dirn...
' __yerleşik__ __arasındaki fark ...