根据条件创建几乎相似的类,减少代码重复

0 投票
2 回答
35 浏览
提问于 2025-04-12 19:58

我有三种情况,分别是:情况1、情况2和情况3:

我需要根据哪个情况为真来定义三个类。这些类几乎都有相同的方法,只是根据不同的情况在处理之前有些不同的步骤。我该怎么做才能避免重复写同样的代码呢?

match condition:

case: "Case1"

    class class1:
        

        def method(self):
            do something to self
            return self

case: "Case2"
    class Class2:
        

        def method(self):
            preprocessing1 on self
            do exact something as in case 1
            return self

case: "Case3"

        class Class2:
        

            def method(self):
                preprocessing2 on self
                do exact something as in case 1
                return self


怎么才能做到不重复写所有的代码呢?

2 个回答

1

我在尝试帮助别人,但我知道我会学到比我能教的更多。根据SIGHUP的建议,我正在重新整理类的定义。

class Class1:

    def __init__(self,case="Case1"):
        self.content = "Raw"

    def method(self):
        self.content = f"Class1 method applied to ({self.content})"
        print(self.content)
        return self
    

class Class2(Class1):

    def __init__(self,case="Case2"):
        super().__init__()
        self.case = case

    def _preprocessing_1(self):
        self.content = f"_preprocessing_1 applied to ({self.content})"
        print(self.content)
        return self

    def _preprocessing_2(self):
        self.content = f"_preprocessing_2 applied to ({self.content})"
        print(self.content)
        return self
    
    def method(self):
        if self.case == "Case2":
            self._preprocessing_1()
        else:
            self._preprocessing_2()     
        super().method() # do exact something as in case 1
        return self
    
    
print("Case1")
c1 = Class1()
c1.method()

print("Case2")
c2 = Class2()
c2.method()

print("Case3")
c3 = Class2("Case3")
c3.method()
1

我会使用继承,唯一的缺点是每次都需要定义class1。

注意:我觉得返回self没有什么好处,因为你已经有了对它的引用。

根据你的例子,下面是伪代码的映射:

class class1:
    
    def method(self):
        do something to self
        

case "Case2":
    class Class2(Class1):
    
        def method(self):
            preprocessing1 on self
            super().method() # do exact something as in case 1
            

case "Case3":
    class Class2(Class1):
    
        def method(self):
            preprocessing2 on self
            super().method() # do exact something as in case 1
            

撰写回答