2011-02-08 18 views

cevap

173

sınıfının metaclass içinde __str__() veya __repr__() uygulamak.

class MC(type): 
    def __repr__(self): 
    return 'Wahaha!' 

class C(object): 
    __metaclass__ = MC 

print C 

Kullanım __str__ Eğer okunabilir bir stringification anlamına kesin beyanlar __repr__ kullanırsanız.

+2

Bir çeşit sınıf dekoratörü oluşturmak istiyorum, bu yüzden her biri için bir metaclass yazmak zorunda kalmadan sınıflarım için özel dize gösterimlerini kolayca ayarlayabilirim. Python'un meta sınıflarına çok aşina değilim, o yüzden bana herhangi bir işaretçi verebilir misin? –

+0

Maalesef bu, sınıf dekoratörleriyle yapılamaz; sınıf tanımlandığında ayarlanmalıdır. –

+9

@ Space_C0wb0y: Sınıf gövdesine '_representation 'gibi bir dize ve metaclassın' __repr __() 'yönteminde' self._representation \ 'i döndürme) ekleyebilirsiniz. –

14
class foo(object): 
    def __str__(self): 
     return "representation" 
    def __unicode__(self): 
     return u"representation" 
+4

Bu, Sorunumu çözmez. Sağladığım kodu deneyin. –

+8

Bu, sınıfın kendisi için değil, sınıfın "örnekleri" için dize temsilini değiştirir. – tauran

+0

Üzgünüz, postanızın ikinci bölümünü görmüyorum. Yukarıdaki yöntemi kullanın. –

1

__repr__ veya __str__ arasında seçim yapmanız gerekiyorsa, varsayılan olarak __str__ çağrıları, tanımlanmadığında __repr__ numaralı çağrıları gerçekleştirin.

Özel vector3 örnek: Bu örnekte

class Vector3(object): 
    def __init__(self, args): 
     self.x = args[0] 
     self.y = args[1] 
     self.z = args[2] 

    def __repr__(self): 
     return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) 

    def __str__(self): 
     return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) 

, repr döner yine str bir hata ayıklama çıkışı olarak daha kullanışlıdır oysa doğrudan idam/tüketilebilir bir dize.

v = Vector3([1,2,3]) 
print repr(v) #Vector3([1,2,3]) 
print str(v)  #Vector(x:1, y:2, z:3) 
+0

'__repr__' vs' __str__' ile ilgili noktanız doğru olsa da, bu asıl soruyu yanıtlamıyor. sınıf nesneleri, örnekler değil. –

+0

Geri bildiriminiz için teşekkürler, bunu tamamen denetleyin. Cevabımı gözden geçirmeme izin verin. – user1767754

+0

Ben repr ve str için uygulamaların değiştirildiğini düşünüyorum. – jspencer

İlgili konular