2009-11-30 21 views
8

¿O es todo un método?¿Hay funciones en Python?

Ya que todo es un objeto, un

def whatever: 

es sólo un método de esa file.py, ¿verdad?

+0

y pensé que la función y el método son sinónimos entre sí. – Amarghosh

+4

@Amarghosh: No. Los métodos son descriptores vinculados a una clase. – nosklo

+1

La terminología varía entre los idiomas que creo - en java todo es un método - estático o instancia. – Amarghosh

Respuesta

31

Python tiene funciones. Como todo es un objeto functions are objects too.

lo tanto, para utilizar su ejemplo:

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

Cuando usamos def hemos creado un objeto que es una función. Podemos, por ejemplo, observamos un atributo del objeto:

>>> whatever.func_name 
'whatever' 

En respuesta a su pregunta - whatever() es no un método de file.py. Es mejor considerarlo como un objeto de función vinculado al nombre whatever en el espacio de nombres global de file.py.

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

O mirar de otra manera, no hay nada que nos impida la unión del nombre de whatever a un objeto diferente por completo:

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

Hay otras maneras de crear objetos de función. Por ejemplo, :

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

Un método es como atributo de un objeto que es una función. Lo que lo convierte en un método es que los métodos se vinculan al objeto. Esto hace que el objeto pase a la función como el primer argumento que normalmente llamamos self.

Vamos a definir una clase SomeClass con un método somemethod y una instancia someobject:

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

Veamos somemethod como un atributo:

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

podemos ver que es un método enlazado en el objeto y un método independiente en la clase. Así que ahora vamos a llamar el método y ver lo que sucede:

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

Como se trata de un método vinculado al primer argumento recibida por somemethod es el objeto y el segundo argumento es el primer argumento en la llamada al método. Vamos a llamar al método en la clase:

>>> 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 se queja porque estamos tratando de llamar al método sin darle un objeto del tipo apropiado.Así que podemos solucionar este problema haciendo pasar el objeto "a mano":

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

podría utilizar las llamadas a métodos de este tipo - llamar a un método en una clase - cuando se quiere llamar a un método específico de una superclase.

(Es posible take a function and bind it to class to make it a method, pero esto no es algo que te gustaría normalmente vez tiene que hacer.)

0

Hmm ... Puede trabajar con "lo que sea" como una función normal en el espacio de nombres de archivos.

2

diferencia en Java en Python un archivo nombrado file.py no necesariamente contener una clase llamada file como usted podría esperar si se trataba de un archivo java llamado file.java.

En Python, un archivo es un módulo que en realidad es solo un espacio de nombres (más comparable a un paquete Java que una clase Java) y no una clase. Considere el ejemplo file.py a continuación:

def whatever_func(): 
    print "What ever function" 

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

En el ejemplo anterior, el módulo de file/espacio de nombres contiene una función ordinaria llamado whatever_func y una clase SomeClass que tiene un método whatever_meth.

Cuestiones relacionadas