Python类,初始化器和方法中的重复功能/代码

时间:2016-06-10 08:05:06

标签: python class python-3.x initialization

我试图以高效和Pythonic的方式在类(包括它们的初始化器)和方法中实现重复的功能。

我是子类化和重写方法(如here所示)。我在每个班级都有计数器定义和增强的作业。

我的代码

class StructuralAnalysis(object):
    def __init__(self):
      self.counter_results = []  # probably a dict would be better

    def generate_structural_metrics(self):
        # declare counters
        cnum = 0
        cstr = 0
        cbytes = 0
        ...
        ...
        ...

        for node in ast.walk(self.tree):
            if isinstance(node, ast.Num):
                cnum += 1
            elif isinstance(node, ast.Str):
                cstr += 1
            elif isinstance(node, ast.Bytes):
                cbytes += 1
            elif ...
            elif ...
            elif ...

            self.counter_results = [cnum, cstr, cbytes, .......] 
            # some counters may require some further calculations

            return self.counter_results

我的问题是上述是否可以以更加Pythonic和/或更有效的方式实施;比如为每个计数器设置一个不同的类方法,每个重写的方法都会调用它来执行增强的赋值?这是为了避免大量的计数器声明和重复的代码。任何建议都会很棒。

1 个答案:

答案 0 :(得分:1)

我不会使用一堆类,因为开销可能太大了(假设大多数只保留一个计数器,对于那种类型)。

但是,我会检查是否有办法通过函数获取ast类型(因此不是isinstance的布尔值,而是类型(var)。当你有ast类型时,你可以使用你已经拥有的字典作为写点像

的想法
counters = {}
for node in ast.walk(self.tree):
    counters[type(node)] += 1

这将迭代所有节点并将计数器添加到字典中。

对于其他计算,您可以制作另一个字典:

counter_calculations = {}

counter_calculations[ast.BYTE] = perform_additional_calculations_byte

对于每种类型,如果需要函数,请添加函数引用。这样,您可以非常轻松地调用类型所需的额外计算(您可以在同一个迭代器中使用它)。

if (type(node) in counter_calculations:
    counter_calculations[type(node)]()

然后实现这些函数,例如一个字节:

def perform_additional_calculations_byte(byte_node):
     ... some calculations

对于要返回的计数器结果,您可以返回计数器字典。