2017-08-18 1 views
1

オブジェクトの作成後に内部メソッドを参照するオブジェクト属性を外部関数に変更すると、以前のように(関数を含む)属性が呼び出されたとしても、selfは新しい関数に渡されません。属性が外部関数を参照するように変更されたら、なぜ自己は渡されませんか?

class Person: 
    def greet(self): 
     print("hello") 

    do = greet 

def wave(person): 
    print("bye") 

alice = Person() 
alice.do() #prints 'hello' 

#change do to point an external function 
alice.do = wave 
alice.do() #Error: Missing argument 

Iを得る正確なエラーは、次のとおり

hello 
Traceback (most recent call last): 
    File "C:\Users\Owner\Desktop\miniLiveMethodSwitch.py", line 15, in <module> 
    alice.do() #Error: Missing argument 
TypeError: wave() missing 1 required positional argument: 'person' 

一つは、内部メソッドとしてクラスに

class Person: 
    def greet(self): 
     print("hello") 

    def wave(person): 
     print("bye") 

    do = greet 

を外部関数を移動すると予想されるように、コードが動作します。属性が外部関数を参照するように変更されたら、なぜ自己は渡されないのですか?自己を渡すように関数を呼び出す適切な方法は何ですか?

答えて

4

Pythonはクラスのdictでalice.doを見つけると、それは機能の__get__メソッドへの呼び出し、descriptor protocolを起動しますalice.doルックアップの結果となるバインドされたメソッドオブジェクトを生成します。このバインドされたメソッドオブジェクトは、selfが何であるべきかを知っており、基底関数に引数を転送するときに引数リストに自動的にself引数を挿入します。 Pythonはalice.doのインスタンス辞書aliceに、ディスクリプタプロトコルが起動されていないと認めるとき

(これはないself名によって、位置が起こる)、及びalice.doは単に生の関数です。 selfは注入されません。

0

このお試しください:出力された

class Person: 
    def greet(self): 
     print("hello") 

    do = greet 

def wave(person): 
    print("bye") 

alice = Person() 
alice.do() #prints 'hello' 
print(type(alice.do)) 

#change do to point an external function 
alice.do = wave 
print(type(alice.do)) 

を:method、その後function

hello 
<class 'method'> 
<class 'function'>