¿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?
¿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?
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.)
Hmm ... Puede trabajar con "lo que sea" como una función normal en el espacio de nombres de archivos.
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
.
y pensé que la función y el método son sinónimos entre sí. – Amarghosh
@Amarghosh: No. Los métodos son descriptores vinculados a una clase. – nosklo
La terminología varía entre los idiomas que creo - en java todo es un método - estático o instancia. – Amarghosh