actualización: Acabo de ver la referencia a call_user_func_array
en su publicación. eso es diferente. getattr
utilizar para conseguir el objeto de función y luego llamarlo con sus argumentos
class A(object):
def method1(self, a, b, c):
# foo
methodname = 'method1'
method = getattr(A, methodname)
method
es ahora un objeto función real. que puede llamar directamente (las funciones son objetos de primera clase en python al igual que en PHP> 5.3). Pero las consideraciones de abajo todavía se aplican. Es decir, el ejemplo anterior explotará a menos que decore A.method1
con uno de los dos decoradores que se describen a continuación, póngale una instancia de A
como primer argumento o aplique getattr
a una instancia de A
.
a = A()
method = getattr(a, methodname)
method(1, 2)
usted tiene tres opciones para hacer esto
- Utilice una instancia de
A
llamar method1
(utilizando dos formas posibles)
- aplicar el decorador
classmethod
a method1
: que no lo hará ya no podrá hacer referencia a self
en method1
, pero se le pasará una instancia de cls
en su lugar que es A
en este caso.
- aplicar el decorador
staticmethod
a method1
: ya no será capaz de hacer referencia a self
, o cls
en staticmethod1
pero se puede codificar las referencias a A
en él, aunque, obviamente, estas referencias serán heredados por todas las subclases de A
a menos que específicamente anula method1
y no llames al super
.
Algunos ejemplos:
class Test1(object): # always inherit from object in 2.x. it's called new-style classes. look it up
def method1(self, a, b):
return a + b
@staticmethod
def method2(a, b):
return a + b
@classmethod
def method3(cls, a, b):
return cls.method2(a, b)
t = Test1() # same as doing it in another class
Test1.method1(t, 1, 2) #form one of calling a method on an instance
t.method1(1, 2) # form two (the common one) essentially reduces to form one
Test1.method2(1, 2) #the static method can be called with just arguments
t.method2(1, 2) # on an instance or the class
Test1.method3(1, 2) # ditto for the class method. It will have access to the class
t.method3(1, 2) # that it's called on (the subclass if called on a subclass)
# but will not have access to the instance it's called on
# (if it is called on an instance)
en cuenta que en la misma forma que el nombre de la variable self
es totalmente de usted, por lo que es el nombre de la variable cls
pero esos son los valores habituales.
Ahora que ya sabes cómo hacerlo, seriamente pensaría en si quieres hacerlo. Muchas veces, los métodos que se deben llamar sin consolidar (sin una instancia) se dejan mejor como funciones de nivel de módulo en python.
significa eso realmente necesita ser un método de la clase y no una función?Los métodos estáticos en otros idiomas no necesariamente se asignan a un método de clase en Python. Dale una lectura: http://dirtsimple.org/2004/12/python-is-not-java.html –
@ Ivo Honestamente, ¿qué te importa si escribe su propio MVC antes de aprender los conceptos básicos? que intente aprender los conceptos básicos en el proceso. dejar de ser tan condescendiente con las personas que hacen preguntas. – aaronasterling
@AaronMcSmooth fue un consejo honesto: ni siquiera hay una respuesta sensata a su pregunta actual porque no tiene sentido, que es lo que sucede a menudo. Intenté escribir una respuesta, pero todo lo que pude fue aconsejarme para aprender los conceptos básicos de Python primero. Agregaré un poco de "bonito por favor" la próxima vez;) –