授業がある:
class A(object):
def do_computing(self):
print "do_computing"
で、〜がある:
new_class = type('B', (object,), {'a': '#A', 'b': '#B'})
私が達成したいのは、クラス A のすべてのメソッドとプロパティをクラス B のメンバーにすることです。クラス A は、そのような要素を 0 から N まで持つことができます。全員をB級にしたい。
これまでのところ、次のようになります。
methods = {}
for el in dir(A):
if el.startswith('_'):
continue
tmp = getattr(A, el)
if isinstance(tmp, property):
methods[el] = tmp
if isinstance(tmp, types.MethodType):
methods[el] = tmp
instance_class = type('B', (object,), {'a': '#A', 'b': '#B'})
for name, func in methods.items():
new_method = types.MethodType(func, None, instance_class)
setattr(instance_class, name, new_method)
しかし、私が実行すると:
instance().do_computing()
エラーが発生します:
TypeError: unbound method do_computing() must be called with A instance as first argument (got B instance instead)
なぜ私はそれをしなければならなかったのですか?多くのレガシー コードがあり、古いオブジェクトのふりをする派手なオブジェクトが必要ですが、実際にはそうではありません。
もう1つ重要なこと。バックグラウンドで多くの魔法が発生するため、継承を使用できません。