1

このクラスを与えられた

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/ /etcメソッドlowerをトリガーしないのですか?__str__

フードの下で何か unicode(self).lower()が起こっているべきではありませんか?

またはstr(self).lower()

4

3 に答える 3

2

s.lowerを呼び出しunicode.lower()ているので、新しい個別のUnicodeオブジェクトを取得します

オブジェクトlower()を返すメソッドが必要ですStringy

例えば。

def lower(self):
    return Stringy(unicode.lower(self))
于 2012-12-17T21:53:56.517 に答える
1

文字列は不変であり、それを呼び出すと新しいupper()文字列が返されるためです。また、新しい文字列は、ではなく実際のインスタンスになります。unicodeStringy

于 2012-12-17T21:53:50.693 に答える
0

の結果が次のタイプの新しいオブジェクトであるため、printはトリガーされません。Stringy.__str__()s.lower()unicode

In [3]: type(Stringy('').lower())
Out[3]: unicode
于 2012-12-17T21:53:50.113 に答える