2016-12-15 13 views
1

私自身の__str__()関数を持つクラスを定義すると、a.__str__()に相当するstr(a)です。ここで、aは私のクラスのインスタンスですか?Pythonの `str()`関数はクラスの `__str __()`関数を呼び出しますか?

私はpython docを確認しましたが、これが明白であるとは言いません。

+0

自分で試してみませんか? –

+1

あなたはそれをテストしてみませんか?新しいクラスを作成し、 '__str__'メソッドをオーバーライドします。 – Carcigenicate

+1

[str doc](https://docs.python.org/3/library/stdtypes.html#str) – tdelaney

答えて

10

短い回答:はい! Python docsによれば


(Iは、関連する部分を強調表示):

STR(オブジェクト)と組み込み関数の形式()と印刷によって呼び出さ

object.__str__(self)

()を使用して、オブジェクトの「非公式」または素敵な印刷可能な文字列表現を計算します。戻り値は文字列オブジェクトでなければなりません。

__str__()が有効なPython式を返すとは期待できない点で、このメソッドはobject.__repr__()とは異なります。より便利で簡潔な表現を使用できます。

組み込み型オブジェクトによって定義されるデフォルトの実装は、object.__repr__()を呼び出します。

したがって、str(your_instance)を実行すると、your_instance.__str__が一般に呼び出されます。


長い答えは:これらはクラスではなく、インスタンスに見上げているので、「特別法」(2つの先頭のアンダースコアと2つの末尾のアンダースコアを持つメソッド)で例外があります。従ってstr(a)は実際にはtype(a).__str__(a)であり、a.__str__()ではありません。しかし、ほとんどの場合、インスタンス上のクラスのメソッドをほとんどオーバーライドしないため、これらは同じです。特に特別な方法ではありません。

も参照してくださいrelevant documentation on "Special method lookup":カスタムクラスの場合

暗黙の呼び出しは特別な方法のだけオブジェクトの型に定義されている場合ではない、オブジェクトのインスタンス辞書で、正常に動作することが保証されています。だから、

@のzzh1996は、次のコードは、インスタンスは、カスタム呼び出し可能__str__属性があっても、クラスで定義されたメソッドを使用しますコメントで指摘したように:

>>> class A(object): 
...  def __str__(self): 
...   return 'a' 
>>> instance = A() 
>>> instance.__str__ = lambda: 'b' 
>>> str(instance) 
'a' 
>>> instance.__str__() 
'b' 
+0

これは間違っています! [21]において ' :クラスA: ...:DEF __str __(自己): ...:戻り '' ...: ...: [22]で: A = A()[23]で :デフF(): ...:リターン 'B' ...:で [24]:.__ STR __ = F において[25]: str(a) Out [25]: 'a' '' ' – zzh1996

+0

@ zzh1996はい、特別なメソッドはインスタンスではなくクラスで検索されます。しかし、私はそれが実際の質問から気をそらすと思った。 "str()"関数がクラスの '__str __()'関数を呼び出すかどうか尋ねた。 (その場合ですが) 'str(a)'は必ず 'a .__ str __()'と同じではなく 'type(a).__ str __(a)'と同じです。しかし、私はその点についてさらに明確にしました。 – MSeifert

2

はい、あります。次の例を見てみましょう:__str__() documentationから、

>>> class A: 
...  def __init__(self, a): 
...   self.a = a 
...  def __str__(self): 
...   print "Inside __str__" 
...   return self.a 
... 
>>> 
>>> a = A('obj1') 
>>> a 
<__main__.A instance at 0x0000000002605548> 
>>> 
>>> a.__str__() 
Inside __str__ 
'obj1' 
>>> 
>>> str(a) 
Inside __str__ 
'obj1' 

をそして、我々は持っている:str(object)によって

object.__str__(self)

と呼ばれる組み込み関数 format()print()を計算します"非公式"またはきれいに印刷可能 オブジェクトの文字列表現。戻り値は文字列 でなければなりません。

関連する問題