我有一个与下面结构相同的代码:
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中的第二个和第三个指令)。这个代码是否正确?如何改进此代码以便不重复代码?
答案 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")
在上面的示例中,c1
和c2
都有method1
的实现,而c3
会抛出NotImplementedError