2009-11-30 17 views
8

Oder ist alles eine Methode?Gibt es Funktionen in Python?

Da alles ein Objekt ist, ein

def whatever: 

ist nur eine Methode dieses file.py, nicht wahr?

+0

und ich dachte, Funktion und Methode sind auch miteinander. – Amarghosh

+4

@Amarghosh: Nein. Methoden sind Deskriptoren, die an eine Klasse gebunden sind. – nosklo

+1

Terminologie variiert zwischen Sprachen, die ich glaube - in Java ist alles eine Methode - statische oder Instanz. – Amarghosh

Antwort

31

Python hat Funktionen. Da alles ein Objekt ist functions are objects too.

So, Ihr Beispiel zu verwenden:

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

Wenn wir def verwenden wir ein Objekt geschaffen, die eine Funktion ist. Wir können zum Beispiel sehen Sie ein Attribut des Objekts:

>>> whatever.func_name 
'whatever' 

In Antwort auf Ihre Frage - whatever() ist nicht eine Methode von file.py. Es ist besser, es als ein Funktionsobjekt zu betrachten, das an den Namen whatever im globalen Namespace file.py gebunden ist.

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

Oder anders, es zu betrachten, gibt es nichts uns von der Bindung des Namens zu stoppen whatever auf ein anderes Objekt insgesamt:

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

Es gibt auch andere Möglichkeiten, Funktionsobjekte zu erstellen. Zum Beispiel :

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

Verfahren sind wie Attribut eines Objekts, das eine Funktion ist. Was es zu einer Methode macht, ist, dass die Methoden an das Objekt gebunden werden. Dadurch wird das Objekt an die Funktion als erstes Argument übergeben, das wir normalerweise self aufrufen.

wir eine Klasse definieren SomeClass mit einem Verfahren somemethod und einer Instanz someobject:

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

die bei somemethod als Attribut Werfen wir einen Blick:

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

Wir können sehen, es ist eine gebundene Methode auf dem Objekt und eine ungebundene Methode für die Klasse. So, jetzt wollen wir die Methode aufrufen und sehen, was passiert:

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

Da es sich um eine gebundene Methode ist das erste Argument erhielt von somemethod ist das Objekt, und das zweite Argument ist das erste Argument in dem Methodenaufruf. Lassen Sie uns die Methode für die Klasse nennen:

>>> 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 beschwert, weil wir es die Methode aufzurufen ohne Angabe ein Objekt des entsprechenden Typs versuchen.So können wir dieses Problem beheben, indem das Objekt „von Hand“ vorbei:

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

Sie könnten Methodenaufrufe dieser Art verwenden - eine Methode für eine Klasse aufrufen - wenn Sie eine bestimmte Methode von einer übergeordneten Klasse aufrufen möchten.

(Es ist möglich, take a function and bind it to class to make it a method, aber das ist nicht etwas, das Sie normalerweise nie tun müssen.)

0

Hmm ... Sie können mit "was auch immer" als normale Funktion im Datei-Namespace arbeiten.

2

Anders als in Java in Python eine Datei namens file.py nicht unbedingt eine Klasse file wie Sie genannt enthält könnte erwarten, dass dies eine Java-Datei mit dem Namen file.java ist.

In Python ist eine Datei ein Modul, das eigentlich nur ein Namespace (eher vergleichbar mit einem Java-Paket als eine Java-Klasse) und keine Klasse ist. Betrachten Sie das Beispiel file.py unter:

def whatever_func(): 
    print "What ever function" 

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

In dem obigen Beispiel das file Modul/Namespace eine gewöhnliche Funktion whatever_func und eine Klasse SomeClass Namen enthält, die whatever_meth ein Verfahren hat.

Verwandte Themen