いくつかのコードから始めましょう:
def func(*x):
print('func:', x)
class ABC:
def __init__(self, f):
self.f1 = f
def f2(*x):
print('f2:', x)
次に、いくつかのテストを行います。
>>> a = ABC(func)
>>> a.f1(10)
func: (10,)
>>> a.f2(10)
f2: (<__main__.ABC object at 0xb75381cc>, 10)
>>> a.f3 = func
>>> a.f3(10)
func: (10,)
>>> a.f1
<function func at 0xb74911ec>
>>> a.f2
<bound method ABC.f2 of <__main__.ABC object at 0xb75381cc>>
>>> a.f3
<function func at 0xb74911ec>
func
これは通常の関数でf1
あり、クラスのメソッドにしていることに注意してください。
すべての関数がクラスメソッドとして呼び出されている場合でもf2
、最初の引数としてクラスインスタンスを取得していることがわかりますが、そうではf1
ありません。f3
また、クラスのメソッドとして正規関数を呼び出す場合、Pythonはそれからバインドされたメソッドを作成しないこともわかります。
では、クラスのメソッドとして呼び出している場合でも、クラスインスタンスが渡されるのはなぜf1
ですか?f3
また、Pythonは、インスタンスを渡さないように、外部関数をメソッドとして呼び出していることをどのように認識しますか。
- 編集 -
さて、基本的に私が間違っているのは、クラスオブジェクト自体ではなく、インスタンスに関数をアタッチしているということです。したがって、これらの関数は単にインスタンス属性になります。これは次のように確認できます。
>>> ABC.__dict__
... contents...
>>> a.__dict__
{'f1': <function func at 0xb74911ec>, 'f3': <function func at 0xb74911ec>}
また、このdictは以下に割り当てることができないことに注意してください。
>>> ABC.__dict__['f4'] = func
TypeError: 'dict_proxy' object does not support item assignment