Python では、実行時にメソッドをクラスに追加できることを知っています。
class Test:
def __init__(self):
self.a=5
test=Test()
import types
def foo(self):
print self.a
test.foo = types.MethodType(foo, test)
test.foo() #prints 5
また、クラス定義でデフォルトのsetattrをオーバーライドできることも知っています。
class Test:
def __init__(self):
self.a=5
def __setattr__(self,name,value):
print "Possibility disabled for the sake of this test"
test=Test() #prints the message from the custom method called inside __init__
ただし、実行時にsetattrをオーバーライドすることはできないようです:
class Test:
def __init__(self):
self.a=5
test=Test()
import types
def __setattr__(self,name,value):
print "Possibility disabled for the sake of this test"
test.__setattr__ = types.MethodType(__setattr__, test)
test.a=10 #does the assignment instead of calling the custom method
最後の 2 つのケースでは、dir(test) はメソッドsetattrも報告します。ただし、最初のケースでは正しく動作しますが、2 番目のケースでは正しく動作しません。明示的に呼び出すこともでき、その場合は機能することに注意してください。メソッドが定義されている間、デフォルトの代入メソッドをオーバーライドするために正しくマッピングされていないようです。何か不足していますか?
ちなみにPython2.7を使っています。プログラム設計の観点からそのようなことを行うのはおそらく良い考えではないため、質問はほとんど学術的なものですが、それでも回答に値します-検索しても、どこにも文書化されていませんでした.