2012-12-17 60 views
1

給這個類蟒蛇爲什麼犯規STR或再版或Unicode得到調用my_string.lower()

class Stringy(unicode): 
    def __init__(self,something): 
     self.something = something 
    def __repr__(self): 
     return "Stringy(%s)"%repr(self.something) 
    def __str__(self): 
     return "str(%s)"%repr(self.something) 
    def __unicode__(self): 
     return "unicode(%s)"%repr(self.something) 

運行以下

s = Stringy("Hello") 
print s.lower() #prints "hello" !!! Why? 
print s # correctly prints str('Hello') 
print unicode(s) #correctly prints unicode('Hello') 
print [s]  #correctly prints Stringy('Hello') 
print s.upper() #prints "HELLO" !!! Why? 

時叫你爲什麼不upper/lower /等觸發__str__方法?

不應該在發動機罩下有什麼東西像 unicode(self).lower()會發生?

str(self).lower()

+0

不要忘記,你繼承的對象通常是不可變的(方法返回原始類型的新實例)。 – mgilson

回答

2

s.lower呼籲unicode.lower(),使你得到一個新的獨特的unicode對象

你需要有lower()方法,它返回一個Stringy對象

如。

def lower(self): 
    return Stringy(unicode.lower(self)) 
+0

但它不應該被稱爲像unicode(self).lower?我不會在'__init__'中做任何超級inits ... –

+0

@JoranBeasley你根本不會覆蓋'lower',所以它直接執行'unicode''實現它,它既沒有寫入也沒有記錄返回子類的實例。 – delnan

+0

@delnan:他從未啓動超類。超類是如何知道對'self.something'採取行動的? –

0

print不會觸發​​因爲s.lower()結果是unicode類型的品牌新的對象:

In [3]: type(Stringy('').lower()) 
Out[3]: unicode 
1

因爲字符串是不可改變的,並呼籲它upper()返回字符串。而你的新字符串將是一個實際的unicode實例,而不是Stringy

+1

非常重要的是要注意Python字符串對象的不變性。 –