从父类继承的子代之间的公共代码

时间:2017-02-20 12:50:22

标签: python

我有一个与下面结构相同的代码:

class parent(Object):

   def method1(self,name):
      raise NotImplementedError("Subclasses should implement this")


class child1(parent)

   def method1(self, name, company)
      print(name + ' ' + company)
      print(name + '!!!')
      name = 'Thanks' + name

class child2(parent)

   def method1(self, name, company)
      print(name + '----' + company)
      print(name + '!!!')
      name = 'Thanks' + name

这里我有2个覆盖父方法的childrer。问题是子类共享一个相同的代码(method1中的第二个和第三个指令)。这个代码是否正确?如何改进此代码以便不重复代码?

3 个答案:

答案 0 :(得分:2)

没有一个单一的答案。这取决于代码以及您想要用它做什么。在您的示例代码的情况下,我将实现一个临时行为的额外父函数:

class Parent(Object):
    def _method1(self, name, company, msg):
        print(name + msg + company)
        print(name + '!!!')
        name = 'Thanks' + name

    def method1(self,name):
        raise NotImplementedError("Subclasses should implement this")


class Child1(Parent)
    def method1(self, name, company)
        self._method1(name, company, '  ')


class Child2(Parent)
    def method1(self, name, company)
        self._method1(name, company, '----')

您还应根据python样式指南使用CamelCase作为您的类名。

答案 1 :(得分:1)

你可以在父母和子女之间建立另一个“中间”的班级。

此课程将实施method1

这个想法是这个类将几个具有相同功能的子类分组。

如果您的其他子项很少需要method1的不同实现,则需要定义另一个将实现method1的parentGrouped类。

class parent(object):

  def method1(self,name):
    raise NotImplementedError("Subclasses should implement this")


class parentGrouped(parent):
  def method1(self, name, company):
    print(name + ' ' + company)
    print(name + '!!!')
    name = 'Thanks' + name

class child1(parentGrouped):
  pass



class child2(parentGrouped):
  pass

答案 2 :(得分:0)

您可以使用mixin。创建一个只包含您想要共享的函数定义的类,并将其包含在继承链中。

例如:

class Parent(object):
    def method1(self,*args, **kwargs):
        raise NotImplementedError("Subclasses should implement this")

class Method1Mixin(object):
    def method1(self, name, company):
        print(name + ' ' + company)
        print(name + '!!!')
        name = 'Thanks' + name

class child1(Method1Mixin, Parent):
    pass

class child2(Method1Mixin, Parent):
    pass

class child3(Parent):
    pass

c1 = child1()
c2 = child2()
c3 = child3()

c1.method1("bob", "bob's company")
c2.method1("carol", "carol's company")
c3.method1("ted", "ted's company")

在上面的示例中,c1c2都有method1的实现,而c3会抛出NotImplementedError