4
class A:
    def foo(self):
        print "foo()"

getattr(A, foo) # True
A.foo() # error

getattr(A(), foo) # True
A().foo() # prints "foo()"

そうは言っても、ここに私の問題があります:

テスト ケース メタ情報を、テスト ケース クラス オブジェクトのインスタンスではなく、それ自体の属性として保存したいと考えています。
抽出する属性名のリストがありますが、同じ名前のインスタンス メソッドがある場合、getattr(class_obj, attr)True が返されますがgetattr(class_obj, attr)()、エラーが発生します。

getattr に、インスタンス化されたクラスの属性を含めず、クラス オブジェクト自体のみを含めるように指示する方法はありますか?

編集:直接アクセスしようとclass_obj.__dict__しましたが(これは悪い習慣だと理解しています)、次のような属性は含まれていません__name__

編集:質問の言い換え。クラス obj のメソッドとクラスのインスタンスのメソッドを区別する方法はありますか?

4

3 に答える 3

0

次のようなものが必要です。

from inspect import ismethod
from collections import Callable
def can_i_call(func):
    if not isinstance(func, Callable):
        # not a callable at all
        return False

    if not ismethod(func):
        # regular function or class or whatever
        return True

    # func is a method
    return func.im_self is not None

注: これは、. なしでバインドされていないメソッドを呼び出しているため、呼び出しの試みがエラーになるかどうかのみをテストしますselffunc()が成功すること、つまり他の理由で失敗しないことを保証するものではありません。

于 2013-08-28T21:35:15.143 に答える