Когда вы начинаете b1 = a()
, это почти то же самое, что и b2 = str()
, за исключением того, что b2
не имеет bound method
b()
класса a
. Следовательно, когда вы вызываете b1.b(...)
, это то же самое, что вызывать print str.decode(b1,...)
или print str.decode(b2, ...)
b1
и b2
одинаковы в том смысле, что оба являются пустыми строками. Теперь посмотрим, что в документах говорится о str.decode
.
декодирование (...)
S.decode ([кодировка [, ошибки ]]) -> объект
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.
Это означает, что третий параметр (фактически второй в контексте bound method
) является своего рода типом ошибки, который будет игнорироваться, если он не соответствует ни одному встроенному (зарегистрированному) типу.
Поэтому, когда вы звоните b1.b('utf-8', 'abc')
, это будет соответствовать b1.b([encoding], [error type])
. Python переведет его на print str.decode(b1, [encoding], [error type])
. Поскольку b1
пусто, а ваш "тип ошибки", который является 'abc'
, не соответствует ни одному зарегистрированному типу ошибки, python просто выводит пустую строку и игнорирует заданный "тип ошибки".
Если вы попробуете b = a('hello')
и b.b('utf-8', 'abc')
, вы увидите, что вывод равен hello
, и 'abc'
не имеет ничего общего. Более того, если вы попытаетесь указать еще один параметр, например b.b('utf-8', 'abc', 'xyz')
, python выдаст ошибку, поскольку str.decode()
принимает только два аргумента в контексте bound method
.