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
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',) {}
#
car vous initialisez b (en tant qu'objet de a) avec rien comme str.
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.
oui, toujours un indice utile ... – miku
Lorsque vous lancez b1 = a()
, il est presque le même que b2 = str()
sauf que b2
n'a pas le bound method
b()
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
.
- 1. Simplifier ce code python
- 2. Pourquoi ai-je cette erreur dans ce code Python?
- 3. Pourquoi ce code Python (Django) manque-t-il de mémoire?
- 4. Pourquoi Me.components Rien?
- 5. Que signifie ce code Python?
- 6. Pourquoi ce code lance System.ExecutionEngineException
- 7. Pourquoi ce code C buggé?
- 8. Pourquoi sprintf() ne génère rien?
- 9. Pourquoi ce code Boost ASIO ne fonctionne-t-il pas avec ce client python?
- 10. Pourquoi ne puis-je pas exécuter ce code? Pourquoi ne puis-je pas exécuter ce code?
- 11. Pourquoi n'ai-je rien avec $ ('# leftquota'). Val()?
- 12. Pourquoi la fonction Membership.CreateUser ne fait rien?
- 13. Quelle est l'erreur dans ce code python?
- 14. python _ + django, est-ce du code compilé?
- 15. Comment réparer l'erreur sur ce code Python?
- 16. Python: Aidez-moi à optimiser ce code.
- 17. critiquer ce code python (crawler avec threadpool)
- 18. Pourquoi rien n'est écrit dans un fichier?
- 19. Pourquoi ce code JS échoue-t-il?
- 20. pourquoi ce code ne fonctionne pas?
- 21. Pourquoi ce code ne fonctionne pas?
- 22. Pourquoi ce code ne fonctionne pas? :(
- 23. pourquoi ce code sql ne fonctionne pas
- 24. Pourquoi ce code TableView fonctionne-t-il?
- 25. pourquoi ce code java ne fonctionne pas?
- 26. Pourquoi obj.style.left = "200px"; travailler dans ce code?
- 27. Pourquoi ce code ne fuit-il pas?
- 28. pourquoi ce code fuit-il? (Iphone)
- 29. C#: Pourquoi ce code est-il ignoré?
- 30. Pourquoi ce code lancer une ActionView :: TemplateError
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. –