Ответ 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.