2010-01-12 197 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? 

回答

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',) {} 
# 
4

因爲你初始化b(作爲a的一個對象)而沒有str。

+0

非常令人困惑的答案,尤其是考慮到多次出現的「b」。我認爲你的意思是說「作爲一個實例」,可能「以空字符串作爲初始值」或類似的東西。 – 2010-01-12 17:05:34

4

嘗試打印(個體經營,X,Y)。你會看到

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

因此,在str.decode(self,*x,**y)self充當空字符串。

+0

是的,總是有幫助的提示... – miku 2010-01-12 11:26:00

2

當您啓動b1 = a(),它幾乎一樣b2 = str()除了b2沒有a類的bound methodb()。因此,當你調用b1.b(...),它是與調用print str.decode(b1,...)print str.decode(b2, ...)

b1b2是它們都是空字符串的方式相同。現在看看有關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的上下文中接受最多兩個參數。