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?
答案 0 :(得分:8)
首先尝试使用某个值初始化字符串:
# 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',) {}
#
答案 1 :(得分:4)
因为你初始化b(作为a的一个对象)没有任何东西作为str。
答案 2 :(得分:4)
尝试打印(self,x,y)。你会看到
('', ('utf-8', 'aaa'), {})
因此,在str.decode(self,*x,**y)
中,self
充当空字符串。
答案 3 :(得分:2)
当您发起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])
将对应print str.decode(b1, [encoding], [error type])
。 Python会将其翻译为b1
。由于'abc'
为空且您的“错误类型”b = a('hello')
与任何已注册的错误类型都不匹配,因此python只打印出一个空字符串并忽略给定的“错误类型”。
如果您尝试b.b('utf-8', 'abc')
和hello
,您会看到输出为'abc'
且与b.b('utf-8', 'abc', 'xyz')
无关。此外,如果您尝试再提供一个参数,例如str.decode()
,则python将引发错误,因为bound method
仅在{{1}}的上下文中接受最多两个参数。