2011-08-08 16 views
4

「hello world」が以下に返されない理由を説明してください。呼び出されたときに正しく表現されるためには、何を修正する必要がありますか?ありがとう。Pythonクラスの簡単なインスタンス化

>>> class MyClass: 
...  i=12345 
...  def f(self): 
...   return 'hello world' 
...  
>>> x=MyClass() 
>>> x.i 
12345 
>>> x.f 
<bound method MyClass.f of <__main__.MyClass instance at 0x060100F8>> 

答えて

5

REPL(またはPythonコンソールなど)の内部では、最後のステートメントから返された値が常に出力されます。それだけで価値あるならば値が出力されます:

>>> 1 
1 

それが割り当てている場合は、何も印刷されません。

>>> a = 1 

しかし、この時計:

>>> a = 1 
>>> a 
1 

を上記のコードでは、

>>> x=MyClass() 
>>> x # I'm adding this :-). The number below may be different, it refers to a 
     # position in memory which is occupied by the variable x 
<__main__.MyClass instance at 0x060100F8> 

したがって、xの値はメモリ内のある場所にあるMyClassのインスタンスです。

>>> x.i 
12345 

x.iの値は12345なので、上記のように印刷されます。

>>> x.f 
<bound method MyClass.f of <__main__.MyClass instance at 0x060100F8>> 

fの値は、xの方法である(それはそれは何かの前でdefを持っていることを意味するものだ、それは方法です)。さて、それは方法であることから、のはそれの後に()を追加することで、それを呼ぶことにしましょう:

>>> x.f() 
'hello world' 

変数xにMyClassのインスタンス上のFメソッドによって返される値は「こんにちは、世界」です!ちょっと待って!引用符があります。さんがprint機能を使って、それらを取り除くしてみましょう:

>>> print(x.f()) # this may be print x.f() (note the number of parens) 
       # based on different versions of Python. 
hello world 
+1

徹底的な答えは良いものであり、時間の価値があります。 – cwallenpoole

+0

ありがとう、@ cwallenpoole!それはそのような徹底的な返答です。私はあなたの明確な説明に本当に感謝しています。 – nlper

+1

@niper - ちなみに、cwallenpooleの答えは(私の意見では)私よりもはるかに明確で、より徹底的な答えです。早くも投票してしまったのでちょうど私の権利をマークする必要性を感じないでください!どちらが最もあなたを「受け入れられる」ものとするかを記入してください。 :) –

8

fは、それを呼び出す必要があります。すなわちx.f()

それはあなたがクラスなしで関数を定義する場合よりも異なるません:

def f(): 
    return 'something' 

あなただけfを参照している場合、あなたは関数自体

print f 

<function f at 0xdcc2a8>をもたらし得るでしょう、一方、

print f() 

収率"something"

+0

は非常に@Joeキングトンをありがとう!私はチュートリアルを見ていて、それは言及されていませんでした。再度、感謝します。 – nlper

関連する問題