3

このコードでは:

def fa(a,b): 
    print a
    print b
    print " fa called"

class A:
    @classmethod
    def fa(a,b): 
        print a
        print b
        print " A.fa called"
class B:
    def __init__(s,a):
        s.a = a

obj1 = B(A.fa)
obj1.a("xxxx")

obj2 = B(fa)
obj2.a("xxxx")

出力:

__main__.A
xxxx
A.fa called
Traceback (most recent call last):
File "test.py", line 20, in <module>
   obj2.a("xxxx")
TypeError: fa() takes exactly 2 arguments (1 given) 

フリーメソッド「fa」が最初のパラメータとして「self」を受け取らないのはなぜですか? バインドされたメソッド A.fa は期待どおりに動作します。

4

2 に答える 2

3

バインドされたメソッドは のクラス メソッドであるため、最初のパラメーターとしてA.fa受け取ります。この関数をどのように呼び出しても、常に最初のパラメーターとして受け取ります。AAA

free メソッドfaはバインドされていないため、受け取る引数は渡されたものだけです。この関数をどのように呼び出しても、渡されたもの以外のパラメーターを受け取ることはありません。

この動作は、メソッドの呼び出し方法がコンテキストを決定する JavaScript のような言語とは異なります。Python では、暗黙的な引数の受け渡し (JavaScript コンテキストに似ています) は関数の定義時に決定され、そのバインディングまたはその欠如は、その関数がどのように呼び出されたかに関係なく、常にその関数に使用されます。

フリー メソッドを動的にバインドする場合は、 を使用してこれを行うことができますtypes.MethodType。次に例を示します。

def fa(x):
    print x

class B: pass

>>> obj1 = B()
>>> obj1.a = MethodType(fa, obj1)
>>> obj1.a()  # obj1.a behaves like an instance method bound to obj1
<__main__.B instance at 0x7f0589baf170>
>>> obj1.a2 = MethodType(fa, B)
>>> obj1.a2() # obj1.a2 acts like a class method bound to B
__main__.B
于 2013-09-27T19:57:49.317 に答える
1

実行しても( ) は のメソッドにobj2.a = faはならないため:afaobj2

>>> class A(object):
...     def meth(self, x, y):
...         print x, y
... 
>>> 
>>> a = A()
>>> 
>>> a.meth
<bound method A.meth of <__main__.A object at 0x10e281950>> # Method
>>>
>>> def fn(x, y):
...     print x, y
... 
>>> 
>>> fn
<function fn at 0x10e287140>
>>> a.fn = fn
>>> 
>>> a.fn
<function fn at 0x10e287140>  # Not a method, still a function
于 2013-09-27T19:56:21.473 に答える