Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python代码相同但继承性不同_Python_Python 2.7_Python 3.x - Fatal编程技术网

Python代码相同但继承性不同

Python代码相同但继承性不同,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我有两个类(Parent1和Parent2)实现了一些方法。然后我有两个类(Child1和Child2),它们应该从相应的父类继承并实现一些函数。问题是Child1和Child2具有完全相同的逻辑,所以我希望有人能为我指出一个可重用性解决方案的方向。我在研究条件继承,但不确定,因为它在我所来自的语言中并不是一个真正的东西 仅举一个简单的示例来获得一个想法: # In file1 class Parent1(): def main_method(self): # Paren

我有两个类(Parent1和Parent2)实现了一些方法。然后我有两个类(Child1和Child2),它们应该从相应的父类继承并实现一些函数。问题是Child1和Child2具有完全相同的逻辑,所以我希望有人能为我指出一个可重用性解决方案的方向。我在研究条件继承,但不确定,因为它在我所来自的语言中并不是一个真正的东西

仅举一个简单的示例来获得一个想法:

# In file1
class Parent1():
    def main_method(self):
        # Parent 1 implementation
        self.arr = [1, 2, 3]

# In file2
class Parent2():
    def main_method(self):
        # Parent 2 implementation
        self.arr = [2, 4, 6]

# In file3
class Child1(Parent1):
    def main_method(self):
        Parent1.main_method(self)
        # Child logic for main_method
        print self.arr

# In file4
class Child2(Parent2):
    def main_method(self):
        Parent2.main_method(self)
        # Child logic for main_method
        print self.arr

在我看来,父母变成孩子更符合逻辑,反之亦然。你可以这样做

class Parent():
    def main_method(self):
        //the child logic in your code
        return self.arr

class Child1(Parent):
    def main_method(self):
       //parent1 logic in your code
       self.arr = [1,2,3]
       Parent.main_method(self)
            print self.arr 

class Child2(Parent):
      def main_method(self):
          //parent2 logic in your code
          self.arr = [2,4,6]
          Parent.main_method(self)
          print self.arr 

我真的不知道这对您的实际代码是否有意义,但通常commin逻辑位于父类中,而子类向代码添加逻辑。希望这会有所帮助。

我想到了两个选择。首先,使用Mixin通过继承添加功能。我觉得这是一个更具python风格的解决方案。请注意,Mixin需要是第一个继承的类,以便它在MRO中位于第一位(否则将找到
父类
方法)

我以前见过这种方法非常成功。例如,
django rest框架
在其代码中使用此模式

第二个选项是使用元类在创建
子类时动态地向它们添加方法

class MethodMeta(type):
    def __new__(cls, name, parents, dct):
        new_cls = super(MethodMeta, cls).__new__(cls, name, parents, dct)

        def main_method(self):
            super(new_cls, self).main_method()
            print(self.arr)

        new_cls.main_method = main_method
        return new_cls

class Child(Parent, metaclass=MethodMeta): pass

上面的代码段使用Python3.X元类语法。如果您想在Python2.X中使用元类,那么必须将其添加为名为
\uuuuuMetaClass\uuuuu
的类变量。注意,这种元类方法的伸缩性不是很好;如果你想用一个元类添加10个方法,那么它比Mixin方法要混乱得多。

父母和孩子都有很大的不同。类和不同方法实现之间的多个附加方法。这是一个庞大的代码库,我没有编写它,只是想消除一些代码重复。哦,我认为childs在代码中添加了与您所说的“问题是Child1和Child2具有完全相同的逻辑”相同的逻辑。啊,您说得对。问题在于,父类是继承和实现QT代码的复杂类,而QT代码是多年前由一位后来离开的开发人员编写的。我希望通过某种方式将子类合并到一个类中并有条件地继承或诸如此类的方式来修复代码重复。如果孩子们正在做同样的事情,例如“self.arr中的每一位数字都是双精度的”,并且父母有复杂的逻辑来产生(例如总是)一个特定的数组,那么父母应该从一个孩子那里继承,这个孩子将相同的逻辑应用于他们的不同方法。当然,这一切都取决于代码的结构以及函数的实际用途,比如mixin解决方案的外观。然后我可以创建从Parent1继承的Child1,并创建从Parent2继承的Child2吗。然后我把我需要在这两个地方重用的方法混入child1和child2?如果你的意思是
类child1(MethodMixin,Parent1):通过
类child2(MethodMixin,Parent2):通过
,那么是的。两个问题。我在哪里调用超级方法初始化父对象?如果它们的子级实现了一些差异,我可以跳过传递并实现这些方法吗?@kjonsson,因为
MethodMixin
不包含
\uuuu init\uuuu
super()。而且,你总是可以在
Child
中实现一个方法,这将是MRO中的第一个方法。因此,一个合法的计划是:创建具有一些方法的child1和child2,它们调用init和super,然后让mixin完成从那以后的所有工作?
class MethodMeta(type):
    def __new__(cls, name, parents, dct):
        new_cls = super(MethodMeta, cls).__new__(cls, name, parents, dct)

        def main_method(self):
            super(new_cls, self).main_method()
            print(self.arr)

        new_cls.main_method = main_method
        return new_cls

class Child(Parent, metaclass=MethodMeta): pass