按成员函数比较和选择类 - 一种巧妙的方式

时间:2012-10-16 12:27:44

标签: python

鉴于:

  1. 一组类实例(CL)和一个引用实例(r)
  2. 该课程有几个getter,例如'getA','getB',...
  3. Todo:通过比较'getA','getB',从CL中找到匹配'r'的那些实例...对于好的代码,只应编写一个选择函数,并调用通过给出不同的吸气剂作为比较和选择标准。

    我的代码如下所示:

    def selector(r, cl, cmp_function_name):
      return [i for i in CL if getattr(r, cmp_function_name)() == getattr(i, cmp_function_name)()]
    # call it like this:
    selector(r, cl, 'getA')
    selector(r, cl, 'getB')
    ...
    

    但我不确定这是整齐还是pythonic。您如何看待它以及如何编码?

    谢谢!

1 个答案:

答案 0 :(得分:2)

我认为你的selector很好;这里有两个建议,使它更快,更pythonic。

  1. 不要为每个项目重新计算getattr(r, cmp_function_name)() CL。计算一次并保存:

    def selector(r, CL, cmp_function_name):
       refval = getattr(r, cmp_function_name)
       return [i for i in CL if getattr(i, cmp_function_name) == refval]
    
  2. 此外,在Python中,如果你的getter没有参数,请使用 properties代替getters:

    class CLClass(object):
        @property
        def A(self):
    

    instead of

    class CLClass(ojbect):
        def getA(self):
    

    然后您可以使用obj.A而不是obj.getA()访问该媒体资源 {{1}}。