如何迭代和过滤对象方法?

时间:2016-12-09 17:48:21

标签: python python-2.7 class methods

我正在开发一个Django项目,我有一个模型模型。

此模型具有其属性,方法和子类。我想迭代并使用" statistics"属性。

所以:

class Model(models.Model):
    name = ...

    def dont_want(self):
        return 'foo'

    def want(self):
        statistic = True
        return self.name

    def want_too(self):
        statistic = True
        return self.name

    def get_methods_with_statistic_attribute(self):
        # WHAT TO DO
        return methods 


model = Model(name='Peter')
for method in model.get_methods_with_statistic_attribute():
    print method

>>> 'Peter'
>>> 'Peter'

有可能吗?

我试过了:

return [a for a in dir(self) if hasattr(getattr(self,a),'statistic')] 

没有成功。

修改

这个问题可以解决我在这里问到的更具体的Django问题:

Django - is it possible to iterate over methods?

2 个答案:

答案 0 :(得分:1)

这是不可能的,因为在您的示例中,statistic不是您方法的属性 - 它只是一个仅限于方法范围的变量。换句话说,您的示例等效于以下内容:

def want(self):
    # Some code
    return

want.statistics = True

这是事实上的属性创建,其中getattr()实际上可以正常工作。

那就是说,没有办法得到一个名为statistics的变量的方法列表。

修改

您可能需要定义一个方法列表,您将在代码的某些特定部分调用这些方法。也许一个选择是在模型的常量中定义这些方法。

class Model(models.Model):
    name = ...
    USEFUL_METHODS = ['want', 'want_too']

    def dont_want(self):
        return 'foo'

    def want(self):
        statistic = True
        return self.name

    def want_too(self):
        statistic = True
        return self.name

# ...

instance = Model()
for method_str in Model.USEFUL_METHODS:
    method = getattr(instance, method_str)
    method()

答案 1 :(得分:0)

如果不执行函数并在执行期间检查函数(或查看它的字节码),则无法检查函数的局部变量,但是您可以检查方法本身设置的属性。

我建议装饰者在定义后立即添加 processBuilder = new ProcessBuilder( Arrays.asList( "python", "oc_db5.py", "-c", "input.json")); processBuilder.directory(new File("/opt/jvision/grpc/gui")); processBuilder.start(); logger.info("Process started ..." + new Date()); int count = 0; BufferedReader br = new BufferedReader(new InputStreamReader( process.getInputStream())); while ((lineData = br.readLine()) != null) { System.out.println("line: " + ++count + " " + lineData); logger.info("line: " + ++count + " " + lineData); } process.waitFor(); process.getErrorStream(); process.waitFor(); process.exitValue(); 属性,以模仿当前设置的逻辑

statistic

然后在函数内部def statistics_method(func): func.statistic = True return func 而不是statistic = True,您可以在定义之前放置@statistics_method,而您当前拥有的代码也可以使用。