a
関数とがあるとしましょうb
。function を呼び出して、 functionを別の関数a
に置き換えることはできますか?b
できるのはわかっていますが、やるだけでb=a(b)
変わりますか?b
a(b)
のコード オブジェクトb
を別の関数のコードに置き換えることができます。
>>> def b():
... print 'b'
...
>>> def a():
... print 'a'
...
>>> def c(f):
... f.__code__ = a.__code__ # func_code instead of __code__ for py 2.5 and earlier
...
>>> c(b)
>>> b()
a
これはほぼ間違いなく、解決しようとしている問題を間違った方法で考えていることを示しています。
関数とメソッドは、それぞれモジュールとクラスの属性です。そのため、required 属性を変更して別の関数を指すことができます。
>>> __name__
'__main__'
>>> def a():
... print 'a'
...
>>> def b():
... print 'b'
...
>>> import sys
>>> sys.modules['__main__'].b = a
>>> b()
a
クラスの場合:
>>> class A(object):
... def a(self):
... print 'a'
... def b(self):
... print 'b'
...
>>> A.b = A.a
>>> x = A()
>>> x.b()
a
また、置換する名前を保持する変数がある場合は、次のように使用setattr
します。
setattr(sys.modules['__main__'],'b',a)
setattr(A,'b',A.a)
文字列 ('b') を変数に置き換えるだけです。
なぜあなたがしたいのか分かりませんか?紛らわしいコードになります。
global
このようなことを達成するために使用できます。
>>> def a():
... global b
... def b():
... print "New Function B"
>>> def b():
... print "Function B"
...
...
>>> b()
Function B
>>> a()
>>> b()
New Function B
>>>
どのメソッドを置き換えるかわからない場合は、 を使用function.func_code
して、ある関数のコードを別の関数に置き換えることができます。
>>> def change(old_func, new_func):
... old_func.func_code = new_func.func_code
...
>>> def a():
... print "Function A"
...
>>> def b():
... print "Function B"
...
>>> def c():
... print "Function C"
...
>>>
>>> change(a, b)
>>> a()
Function B
>>> change(a, c)
>>> a()
Function C
>>>
こんな感じで簡単にできます
def a(func):
globals()[func] = c
def b():
print('b')
def c():
print('c')
a()
b()
>>> c
あなたが何を目指しているのかわかりませんが、はい、それを行うことができます:
>>> def a():
... global b
... b = a
... return 'a'
...
>>> def b():
... return 'b'
...
>>> b()
'b'
>>> a()
'a'
>>> b()
'a'
>>> def c(f):
事前に b を上書きしていることがわからない場合はどうすればよいでしょうか? つまり、b を引数として a に渡したい場合
>>> def c(f):
... global b
... b = f
... return 'c'
...
>>> def d():
... return 'd'
...
>>> b()
'a'
>>> c(d)
'c'
>>> b()
'd'
>>> c(a)
'c'
>>> b()
'a'