2013-07-12 46 views
0

說我被迫使用SQLObject的版本預計魔術__unicode__上自定義字符串樣的類型,我想繼承格式的字符串,並滿足該要求:如何從str正確繼承?

class Foo(str): 
    extra_attribute = 42 

    def __repr__(self): 
     return repr(self) # optional 

    def __unicode__(self): 
     return unicode(self) # infinite recursion 
     return super(Foo, self).__unicode__() # str doesn't have __unicode__ 
     return unicode(str(self)) # an ugly hack, but works 

是最後一行我能做的最好的,還是有更清潔的方式?

轉換在Python 2.x中的Unicode狀物體顯然,正確的方法是這樣的:

return unicode(x) 

,或者更冗長:

if hasattr(x, "__unicode__"): 
    return x.__unicode__() 
else: 
    return unicode(x) 

不幸的是,SQLObject的版本,我不得不使用沒有按不這樣做。

+1

的正確方法是*解碼*爲Unicode。 'self.decode(some_encoding)'。 –

+2

'sqlobject' *強制*繼承'str'嗎?我認爲子類化內置插件是應該儘可能避免的。 – Bakuriu

+1

事實上,*子類化*應該避免,因爲它引入了緊密耦合。鴨子打字是避免這種情況的方法。 –

回答

2

正確的方法是將解碼爲爲Unicode。 self.decode(some_encoding)

字節字符串可以是任何編碼。如果你總是使用 ASCII,然後使用它作爲您的編解碼器:

return self.decode('ASCII') 
+0

我見過別人更喜歡'unicode(...)'內建/構造函數'str.decode(...)',你對此有何看法? –

+1

如果他們省略了一個編解碼器,那麼他們還沒有考慮過從一個字節串轉換爲一個unicode值的意思。 *使用*編解碼器,我沒有偏好。 'unicode(...)'可能會快一點,因爲它是一個直接的內置調用,而不是方法查找和調用。 –