2010-10-04 26 views
24

En Python, ¿hay alguna manera de llamar a un método de clase de otra clase? Estoy intentando hacer girar mi propio framework MVC en Python y no puedo encontrar la manera de invocar un método de una clase en otra clase.Método de clase de llamada de otra clase

Esto es lo que quiero que suceda:

class A: 
    def method1(arg1, arg2): 
     # do code here 

class B: 
    A.method1(1,2) 

estoy consiguiendo poco a poco en Python desde PHP, así que estoy por el equivalente de PHP Pitón de call_user_func_array().

+0

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 –

+5

@ 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

+4

@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;) –

Respuesta

33

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

  1. Utilice una instancia de A llamar method1 (utilizando dos formas posibles)
  2. 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.
  3. 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.

+0

cuál es el significado de cls en '@ class method def method3 (cls, a, b): return cls.method2 (a, b)' –

4

Sólo tiene que llamar y suministrar self

class A: 
    def m(self, x, y): 
     print(x+y) 

class B: 
    def call_a(self): 
     A.m(self, 1, 2) 

b = B() 
b.call_a() 

de salida: 3

+0

este ejemplo es incorrecto ya que está pasando clase B referencia al método de clase A –

+0

I Supongo que funcionará siempre que todos los atributos referidos como self.x en el método también existan en B – a1an

+0

@VarunMaurya, Python utiliza el tipado de pato, por lo que las clases no se verifican. Como dice a1an, siempre que suministre un objeto con los atributos correctos, esto funcionará. – ratiotile

Cuestiones relacionadas