2010-01-12 4 views
0
class a(str): 
    def b(self,*x,**y): 
     print str.decode(self,*x,**y) 

b=a() 
b.b('utf-8','aaa') # This prints nothing, why? 

Répondre

8

Essayez initialiser votre première chaîne, avec une certaine valeur:

# classes should have capitalized names ... 
class a(str): 
    def b(self,*x,**y): 
     print 'debugging: ', self, x, y 
     print str.decode(self, *x,**y) 

if __name__ == '__main__': 
    b=a('aaa') 
    b.b('utf-8') 

    b=a() 
    b.b('utf-8') 

# => output 

# debugging: aaa ('utf-8',) {} 
# aaa 
# debugging: ('utf-8',) {} 
# 
4

car vous initialisez b (en tant qu'objet de a) avec rien comme str.

+0

Réponse très confuse, en particulier étant donné les multiples occurrences de "b". Je pense que vous vouliez dire "comme une instance d'un", et éventuellement "avec une chaîne vide comme valeur initiale" ou quelque chose comme ça. –

4

Essayez d'imprimer (auto, x, y). Vous verrez

('', ('utf-8', 'aaa'), {}) 

Par conséquent, str.decode(self,*x,**y), self agit comme la chaîne vide.

+0

oui, toujours un indice utile ... – miku

2

Lorsque vous lancez b1 = a(), il est presque le même que b2 = str() sauf que b2 n'a pas le bound methodb() de classe a. Par conséquent, lorsque vous invoquez b1.b(...), c'est la même que l'appel print str.decode(b1,...) ou print str.decode(b2, ...)

b1 et b2 sont les mêmes dans la façon dont ils sont à la fois des chaînes vides. Maintenant, jetez un oeil à ce que les docs disent à propos de str.decode.

decode (...) S.decode ([encodage [, erreurs]]) -> objet

Decodes S using the codec registered for encoding. encoding defaults 
to the default encoding. **errors** may be given to set a different error 
handling scheme. Default is 'strict' meaning that encoding errors raise 
a UnicodeDecodeError. Other possible values are 'ignore' and 'replace' 
as well as any other name registerd with codecs.register_error that is 
able to handle UnicodeDecodeErrors. 

Cela signifie que le troisième paramètre (en fait le deuxième dans la contexte de bound method) est une sorte de type d'erreur qui serait ignoré s'il ne correspondait à aucun type intégré (enregistré).

Donc, lorsque vous appelez b1.b('utf-8', 'abc'), ce qui correspond à b1.b([encoding], [error type]). Python va le traduire en print str.decode(b1, [encoding], [error type]). Puisque b1 est vide et que votre "type d'erreur" qui est 'abc' ne correspond à aucun type d'erreur enregistré, python imprime simplement une chaîne vide et ignore le "type d'erreur" donné.

Si vous essayez b = a('hello') et b.b('utf-8', 'abc'), vous verrez que la sortie est hello et il n'y a rien à voir avec 'abc'. De plus, si vous essayez de fournir un paramètre supplémentaire tel que b.b('utf-8', 'abc', 'xyz'), python déclenchera une erreur puisque str.decode() n'accepte que jusqu'à deux arguments dans le contexte de bound method.