Подтвердить что ты не робот

Метод класса вызова из другого класса

В Python существует ли способ вызвать метод класса из другого класса? Я пытаюсь свернуть свою собственную структуру MVC в Python, и я не могу понять, как вызвать метод из одного класса в другом классе.

Вот что я хочу:

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

class B:
    A.method1(1,2)

Я медленно вхожу в Python из PHP, поэтому я ищу эквивалент Python для PHP call_user_func_array().

4b9b3361

Ответ 1

update: просто посмотрел ссылку на call_user_func_array в вашем сообщении. это другое. используйте getattr, чтобы получить объект функции, а затем вызовите его своими аргументами

class A(object):
    def method1(self, a, b, c):
        # foo

methodname = 'method1'
method = getattr(A, methodname)

method теперь является фактическим функциональным объектом. которые вы можете вызвать напрямую (функции - это объекты первого класса в python, как в PHP > 5.3). Но соображения снизу все еще применяются. То есть приведенный выше пример взорвется, если вы не украсите A.method1 одним из двух декораторов, рассмотренных ниже, передайте ему экземпляр A в качестве первого аргумента или примените getattr к экземпляру A.

a = A()
method = getattr(a, methodname)
method(1, 2)

У вас есть три варианта для этого:

  • Используйте экземпляр A для вызова method1 (используя две возможные формы)
  • примените декоратор classmethod к method1: вы больше не сможете ссылаться на self в method1, но вы получите переданный экземпляр cls в нем, где A в этом случае.
  • примените декоратор staticmethod к method1: вы больше не сможете ссылаться на self или cls в staticmethod1, но можете скопировать ссылки на A в него, хотя, очевидно, эти ссылки будут наследоваться всеми подклассами A, если они специально не переопределяют method1 и не вызывают super.

Некоторые примеры:

class Test1(object): # always inherit from object in 2.x. it 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 called on (the subclass if called on a subclass) 
                     # but will not have access to the instance it called on 
                     # (if it is called on an instance)

Обратите внимание, что так же, как имя переменной self полностью зависит от вас, так же как и имя переменной cls, но это обычные значения.

Теперь, когда вы знаете, как это сделать, я бы серьезно подумал, хотите ли вы это сделать. Часто, методы, которые должны быть названы unbound (без экземпляра), лучше оставить в качестве функций уровня модуля в python.

Ответ 2

Просто позвоните и поставьте 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()

вывод: 3