-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 回答