6

変数が関数またはクラス メソッドのいずれかを参照している場合、特に指定された例のようにクラスがまだ宣言されている場合に、それがクラス メソッドである場合に、それがどちらであるかを調べてクラス タイプを取得するにはどうすればよいですか。

例えば。

def get_info(function_or_method):
    print function_or_method

class Foo(object):
    def __init__(self):
        pass

    get_info(__init__)

def bar():
    pass

get_info(bar)

David と JF Sebastian からの最初の 2 つの応答の後の質問への更新 JF Sebastian がほの​​めかした点を再度強調するために、クラス内で関数が宣言されているとき (取得している型が関数のとき) を区別できるようにしたいと考えています。バインドされたメソッドまたはバインドされていないメソッドではありません)。すなわち。への最初の呼び出しがget_info(__init__)発生する場所で、そのメソッドがクラスの一部として宣言されていることを検出できるようにしたいと考えています。

この質問は、デコレーターを配置していて、init関数へのハンドルを取得し、メソッドがクラス内で宣言されているか、スタンドアロン関数として宣言されているかを実際に把握できないために発生しました。

4

3 に答える 3

13

タイプを確認することで、2 つを区別できます。

>>> type(bar)
<type 'function'>
>>> type(Foo.__init__)
<type 'instancemethod'>

また

>>> import types
>>> isinstance(bar, types.FunctionType)
True
>>> isinstance(bar, types.UnboundMethodType)
True

これは、ifステートメントで行う方法です。

im_classまた、メソッドの属性からクラスを取得できます。

>>> Foo.__init__.im_class
__main__.Foo
于 2009-03-30T00:29:51.447 に答える
9

get_info(__init__)(クラス定義内で)呼び出しているとき、これ__init__は通常の関数です。

def get_info(function_or_method):
    print function_or_method

class Foo(object):
    def __init__(self):
        pass
    get_info(__init__)   # function

def bar():
    pass

get_info(Foo.__init__)   # unbound method
get_info(Foo().__init__) # bound method
get_info(bar)            # function

出力(CPython、IronPython):

<function __init__ at ...>
<unbound method Foo.__init__>
<bound method Foo.__init__ of <__main__.Foo object at ...>>
<function bar at ...>

出力(Jython):

<function __init__ 1>
<unbound method Foo.__init__>
<method Foo.__init__ of Foo instance 2>
<function bar 3>
于 2009-03-30T00:42:17.203 に答える
4

JFセバスティアンがほのめかした点を強調するために、関数がクラス内で宣言されているとき(取得している型が関数であり、バインドされたメソッドまたはバインドされていないメソッドではない場合)を区別できるようにしたいと思います。すなわち。最初の呼び出しがget_info(__init__)発生する場所で、そのメソッドがクラスの一部として宣言されていることを検出できるようにしたいと思います。

この質問は、デコレータを配置していて、init関数へのハンドルを取得し、メソッドがクラス内で宣言されているのか、スタンドアロン関数として宣言されているのかを実際に理解できないために発生しました。

できません。JFセバスティアンの答えはまだ100%当てはまります。クラス定義の本体が実行されているとき、クラス自体はまだ存在していません。ステートメント(__init__関数定義とget_info(__init__)呼び出し)は、新しいローカル名前空間で発生します。の呼び出しがget_info発生した時点で__init__は、その名前空間内の関数への参照であり、クラスの外部で定義された関数と区別できません。

于 2009-03-30T07:20:29.383 に答える