Python类、初始值设定项和方法中的重复功能/代码

Python类、初始值设定项和方法中的重复功能/代码,python,class,python-3.x,initialization,Python,Class,Python 3.x,Initialization,我正试图以一种高效的python方式在类(包括它们的初始值设定项)和方法中实现一个重复的功能 我正在对方法进行子类化和重写(如图所示)。我在每节课上都定义了计数器并增加了作业 我的代码 class StructuralAnalysis(object): def __init__(self): self.counter_results = [] # probably a dict would be better def generate_structural_met

我正试图以一种高效的python方式在类(包括它们的初始值设定项)和方法中实现一个重复的功能

我正在对方法进行子类化和重写(如图所示)。我在每节课上都定义了计数器并增加了作业

我的代码

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

我的问题是,能否以一种更通情达理和/或更有效的方式实施上述措施;就像每个被重写的方法将调用以执行扩充赋值的每个计数器都有一个不同的类方法一样?这是为了避免大量可能的计数器声明和重复代码。任何建议都很好。

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

但是,我会检查是否有办法通过函数获取ast类型(因此不是isinstance的布尔值,而是类型(var)

counters = {}
for node in ast.walk(self.tree):
    counters[type(node)] += 1
这将遍历所有节点,并将计数器添加到字典中

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

counter_calculations = {}

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

然后实现以下功能,例如一个字节:

def perform_additional_calculations_byte(byte_node):
     ... some calculations

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

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

但是,我会检查是否有办法通过函数获取ast类型(因此不是isinstance的布尔值,而是类型(var)

counters = {}
for node in ast.walk(self.tree):
    counters[type(node)] += 1
这将遍历所有节点,并将计数器添加到字典中

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

counter_calculations = {}

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

然后实现以下功能,例如一个字节:

def perform_additional_calculations_byte(byte_node):
     ... some calculations

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

您在寻找python中的元编程吗?@biobirdman不知道那是什么。只是探索类中实现重复功能的“最佳”方法。您在寻找python中的元编程吗?@biobirdman不知道那是什么。只是探索关于在类中实现重复功能的“最佳”方法真的..我很难理解你的建议(Python新手)。请你花几分钟时间将你所说的实现到我在描述中作为示例的小代码块上好吗?我将你的所有代码改编成我认为你正在寻找的解决方案(或者我错过了一个代码块?)我理解你的建议。非常聪明。但是,对于这个特定的情况,我确实需要进行所有的
isinstance
检查,所以我想这对我来说不是一个理想的解决方案。如果没有其他建议,我会接受你的答案。如果你需要isinstance(例如,因为您想将某些类“分组”为一个类型,所以可以创建一个不同的函数,将类/类型转换为您想要使用的ast类型,并将其放入字典中。我很难理解您的建议(Python新手)。请您花几分钟的时间将您所说的实现到我在描述中作为示例的小代码块上,好吗?我将您的所有代码改编成我认为您正在寻找的解决方案(或者我是否错过了一个代码块?)我理解你的建议。非常聪明。但是,对于这个特定的情况,我确实需要进行所有的
iInstance
检查,所以我想这对我来说不是一个理想的解决方案。如果没有其他建议,我会接受你的回答。如果你需要iInstance(例如,由于您希望将某些类“分组”为一个类型,因此可以创建一个不同的函数,将类/类型转换为要使用的ast类型,并将其放入字典中。