-1

私はいくつかのコードをリファクタリングしていて、リフレクションを少し使用できると思いました! だから、私は今のところこれを持っています:

def f(self, clazz):
    [...]
    boolean = False
    if hasattr(clazz_instace, 'some_attribute'):
        setattr(clazz_instace, 'some_attribute', True)
        boolean = True

    if boolean:
        result = getattr(clazz_instace, 'another_method')(None, request=request)
        return result['objects']

    sorted_objects = getattr(clazz_instace, 'One_more_method')(request)
    result = getattr(clazz_instace, 'another_method')(sorted_objects, request=request)

    return [...]

私の質問は、clazz_instance に関して検索しているメソッドを示すために使用した文字列についてです。私がしたことを行うための別の最良の方法があるかどうか知りたいです(具体的には動的な方法で)?つまり、私が行ったようにメソッドの名前を文字列のように直接配置する代わりに、これらのメソッドを別の方法で動的に検証できれば本当にいいでしょう。

素敵なアイデアを教えていただけませんか?どのようにしますか?

前もって感謝します!!!

4

2 に答える 2

1

インスタンスのメソッドは、インスタンスのfunctionに格納されているオブジェクトにすぎません__dict__。これは、おそらく、クラスが実際に引数文字列に対応する属性を持っているが、関数ではなく、代わりに別のタイプであることを除いて、それらを見つけるために正しくやっていると言われています。

これに依存する場合は、インスタンスの関数検索コードをヘルパー メソッドにリファクタリングすることをお勧めします。

import types
def instance_has_method(instance, name):
    try:
        attr = getattr(instance, name)
        return isinstance(attr, types.FunctionType)
    except AttributeError:
        return False

この関数を取得すると、属性が実際に関数であり、呼び出し可能であることが確実になるため、コードはより簡潔になります。

上記のコードは、属性が関数かどうかをチェックします。より広いものが必要な場合は、次のcallableようなものかどうかを確認できますreturn hasattr(attr, '__call__')

Python では、これは基本的にクラス内の属性をチェックする方法です。あなたのアプローチに何の問題もないと思いますし、リフレクションを行う別のより賢い方法もありません。

お役に立てれば!

于 2013-11-08T21:28:37.063 に答える
0

何を達成しようとしているのかを理解するのは簡単ではありません。

getattr(clazz_instace, 'One_more_method')(request)はただの派手な言い方clazz_instace.One_more_method(request)です。

getattrメソッド名が事前にわからない場合、つまりメソッド名が変数の場合は、of を使用するのが合理的です。

また、setattr(clazz_instace, 'some_method_inside_this_class', True)疑惑をそのクラス内の値を持つスカラーsome_method_inside_this_class属性に変換します。おそらく、これはあなたが計画したものではありません。True

あなたのコードを理解するための私の最善の努力はこれです:

def f(clazz):
  # if clazz is capable of better_processing, use it:
  if hasattr(clazz, 'better_processing'):
    return clazz.better_processing(...)
  else:
    return clazz.basic_processing(...)

ところで、getattrあなたに提供されるのは呼び出し可能なメソッドです。次のように直接使用できます。

method = getattr(clazz, 'better_method', clazz.default_method)
# if 'better_method' was available, it was returned by getattr;
# if not, the default method was returned.
return method(clazz_instance, some_data...)
于 2013-11-08T21:37:42.283 に答える