2009-11-30 4 views
8

それはすべての方法ですか?Pythonには関数がありますか?

すべてが対象ですので、

def whatever: 

は右、そのfile.pyだけの方法ですか?

+0

と私は機能と方法がお互いに同義であると考えました。 – Amarghosh

+4

@Amarghosh:いいえ。メソッドはクラスにバインドされた記述子です。 – nosklo

+1

用語は私が信じる言語の間で異なります - すべてが静的またはインスタンスのメソッドです。 – Amarghosh

答えて

31

Pythonには機能があります。すべてがオブジェクトなのでfunctions are objects too

だから、あなたの例を使用する:私たちはdefを使用する場合

>>> def whatever(): 
...  pass 
... 
>>> whatever 
<function whatever at 0x00AF5F30> 

我々は機能であるオブジェクトを作成しました。私たちは、例えば、オブジェクトの属性を見ることができます:あなたの質問への答えで

>>> whatever.func_name 
'whatever' 

からwhatever()file.py方法ではありません。グローバル名前空間file.pyにあるwhateverという名前にバインドされた関数オブジェクトと考える方がよいでしょう。

>>> globals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d 
oc__': None, 'whatever': <function whatever at 0x00AF5EB0>} 

あるいはそれを別の方法を見て、まったく別のオブジェクトに名前whateverを結合から私たちを止めるものは何もありません:

>>> whatever 
<function whatever at 0x00AF5F30> 
>>> whatever = "string" 
>>> whatever 
'string' 

関数オブジェクトを作成するための他の方法があります。たとえば、:

>>> somelambda = lambda x: x * 2 
>>> somelambda 
<function <lambda> at 0x00AF5F30> 

メソッドは、オブジェクトである関数のようなものです。それをメソッドにするのは、メソッドがオブジェクトにバインドされることです。これにより、オブジェクトは最初にselfと呼ばれる最初の引数として関数に渡されます。

のメソッドsomemethodとインスタンスsomeobjectでクラスSomeClassを定義してみましょう:

>>> class SomeClass: 
...  def somemethod(one="Not Passed", two="Not passed"): 
...   print "one = %s\ntwo = %s" % (one,two) 
... 
>>> someobject = SomeClass() 

のは、属性としてsomemethodを見てみましょう:

>>> SomeClass.somemethod 
<unbound method SomeClass.somemethod> 
>>> someobject.somemethod 
<bound method SomeClass.somemethod of <__main__.SomeClass instance at 0x00AFE030 

我々は、それがオブジェクトにバインドされたメソッドです見ることができますクラスのバインドされていないメソッドそれはsomemethodで受信した最初の引数はオブジェクトであり、2番目の引数はメソッド呼び出しの最初の引数でバインドされた方法だとして

>>> someobject.somemethod("Hello world") 
one = <__main__.SomeClass instance at 0x00AFE030> 
two = Hello world 

を:だから今のは、メソッドを呼び出して、何が起こるか見てみましょう。のは、クラスのメソッドを呼ぶことにしましょう:私たちはそれを適切な型のオブジェクトを与えることなくメソッドを呼び出ししようとしているので、

>>> SomeClass.somemethod("Hello world") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method somemethod() must be called with SomeClass instance as first argument (got str instance instead) 

Pythonは文句を言います。だから我々は「手で」オブジェクトを渡すことによってこの問題を解決することができます

>>> SomeClass.somemethod(someobject,"Hello world") 
one = <__main__.SomeClass instance at 0x00AFE030> 
two = Hello world 

あなたがこのタイプのメソッド呼び出しを使用する可能性があります - クラスのメソッドを呼び出す - あなたはスーパークラスから特定のメソッドを呼び出したいとき。

(それはtake a function and bind it to class to make it a methodすることが可能であるが、これはあなたが正常に今までに行う必要があるだろうものではありません。)

0

Hmm ...ファイルネームスペース内の通常の関数として "whatever"で作業できます。

2

file.pyという名前のファイルはPythonでJavaとは異なり、必ずしもあなたのようfileと呼ばれるクラスが含まれていませんこれがfile.javaという名前のJavaファイルであると予想される可能性があります。

ファイルは、実際には名前空間(JavaクラスよりもJavaパッケージに似ています)であり、クラスではないモジュールです。 fileモジュール/名前空間がwhatever_func名前通常の関数と方法whatever_methを持つクラスSomeClassを含有する上記の例で

def whatever_func(): 
    print "What ever function" 

class SomeClass(object): 
    def whatever_meth(self): 
     print "What ever method" 

:以下の例file.pyを考えます。

関連する問題