Python call_user_func()
PHP gibi bir işlevi var mı?
PHP Sürümü:
call_user_func(array($object,$methodName),$parameters)
Nasıl Python yukarıda elde edebilirim?
Örneğini hangi nesneyi toplama o kadar da zor değildir. A sınıfı birinci sınıf bir nesnedir ve bir değişkene atanan ya da bir işleve argüman olarak geçirilebilir.
class A(object):
def __init__( self, arg1, arg2 ):
etc.
class B(object):
def __init__( self, arg1, arg2 ):
etc.
thing_to_make = A
argList= ( some, pair )
thing_to_make( *argList )
thing_to_make = B
argList- ( another, pair )
thing_to_make( *argList )
def doSomething( class_, arg1, arg2 ):
thing= class_( arg1, arg2 )
thing.method()
print thing
Tüm fazla ağrı olmadan güzel çalışıyor. Siz Python şey bir "call_user_function" tür gerekmez
methodName
bir dize sürece, sorun görmüyorum. Bu durumda getattr işini yapar:
>>> class A:
... def func(self, a, b):
... return a + b
...
>>> a = A()
>>> getattr(a, 'func')(2, 3)
5
object
de bir dize ise, o zaman bu globals veya locals kullanarak, işe (ama sonra diğer, daha büyük, sorunlar olabilir):
>>> getattr(locals()['a'], 'func')(2, 3)
5
>>> getattr(globals()['a'], 'func')(2, 3)
5
Edit: senin açıklama re. Bir dize dayalı bir nesneyi başlatmak için:
>>> class A:
... def __init__(self): print('a')
...
>>> class B:
... def __init__(self): print('b')
...
>>> clsStr = 'A'
>>> myObj = locals()[clsStr]()
a
Bu size çok farklı sınıflar rağmen sürece ..., neden sadece dize eşleştirme yapmak istemiyor gerçekten ne olup olmadığından emin değilim?
Another edit: Yukarıdaki eserlerinden rağmen, ciddi bir şekilde Ignacio Vazquez-Abrams tarafından sağlanan bir çözüm ile devam düşünmelisiniz. Bir şey için, mümkün olan tüm sınıfları saklayarak bir dict
, sadece geçerli kapsam içinde olmayan bir ilgili sınıfın adı eşleştirmek olur yanlış bir dize argümanı iletmekle kaynaklanabilir garip davranışlar kaçının.
Eğer (ve hiç bir sınıfları gerekiyorsa aslında,) daha sonra oluşturmak ve onlar için bir sözlük kullanarak kapalı iyi uzak yerlerden gelen sınıfları kullanmak gerekirse:
funcs = {'Eggs': foo.Eggs, 'Spam': bar.Spam}
def call_func(func_name, *args, **kwargs):
if not func_name in funcs:
raise ValueError('Function %r not available' % (func_name,))
return funcs[func_name](*args, **kwargs)
Siz benzer bir şey yapmak) (yerliler () veya globalleri ile kullanım getattr çağırabilirsiniz
# foo.method() is called if it's available in global scope
getattr(globals()['foo'], 'method')(*args)
# Same thing, but for 'foo' in local scope
getattr(locals()['foo'], 'method')(*args)
Ayrıca bkz: Dive Into Python getattr() on, on locals() and globals()