首页 > 解决方案 > 防止 Python 类中的代码重复

问题描述

这是我的代码的一部分:

class classA(Something):

    CONFIG={
        "opt_a": "opt_b"
    }

    def construct(self):
         Some Unique Code
         .
         .
         .
         .
         Some Common Code

class classB(Something):

    CONFIG={
        "opt_a": "opt_b"
    }

    def construct(self):
         Some Unique Code
         .
         .
         .
         .
         Some Common Code

该部分超过 200 行,在和Some Common Code中完全相同。我必须创建 5 个或更多这样的类。这将导致大量重复。classAclassB

更新:这些Some Common Code部分由许多循环和其他依赖于数据的函数组成Some Unique Code

classA拉斐尔的解决方案后更新:和中有一些常见的变量classB。这些变量在“通用代码”和“唯一代码”中都使用。将它们从一个类移到另一个类会产生可变undefined错误。

这是我更新后的代码:

class Something(Else):
      
      CONFIG = {
          "alpha": "beta"
      }

      def setup(self):
            // Some Code
            return self

      def common_method(self):

            for i in texts:
                  // Manipulates Boxes

class classA(Something):

    CONFIG={
        "opt_a": "opt_b"
    }

    def construct(self):
         texts = []

         texts.append('Apple')
         .
         .
         .
         .
         self.common_method()

class classB(Something):

    CONFIG={
        "opt_a": "opt_b"
    }

    def construct(self):
         texts = []

         texts.append('Mango')
         .
         .
         .
         .
         self.common_method()
      

我是 Python 新手,所以我不知道如何避免这种重复。任何帮助,将不胜感激。

谢谢。

标签: pythonpython-3.xoopinheritance

解决方案


作为@Raphael 答案的替代方案,我们可以专注于“构造”方法并提出这样的结构:

class Something:

    def common_method(self):
        """ """

    def construct(self):
        self.common_method()


class ClassA(Something):

    def construct(self):
        # A-specific code
         super().construct()


class ClassB(Something):

    def construct(self):
        # B-specific code
         super().construct()

,但是如果没有更多细节,很难说什么会更好。

更新:如果您需要与不同方法一起使用公共变量,那么您需要将它们设置为object attributes(或class attributes)。

在python中有一个特殊的方法——__init__用来构造一个对象。

这是您的案例的示例:

class Something(Else):

    def __init__(self):
        self.texts = []
        
    CONFIG = {
        "alpha": "beta"
    }

    def setup(self):
        # Some Code
        return self

    def common_method(self):

        # Manipulates Boxes
        for i in self.texts:
            pass


class classA(Something):

    CONFIG={
        "opt_a": "opt_b"
    }

    def construct(self):
        self.texts.append('Apple')
        self.common_method()


class classB(Something):

    CONFIG={
        "opt_a": "opt_b"
    }

    def construct(self):
        self.texts.append('Mango')
        self.common_method()

推荐阅读