我正在构建一个继承自另一个类Parent的类Child。 Parent类有一个Child将使用的loadPage方法,除了Child需要在loadPage函数末尾附近但在函数的最终语句之前运行自己的代码。我需要以某种方式将此函数仅插入到load的实例中,而不是父实例。我正在考虑将一个customFunc参数放入loadPage,并将其默认设置为None for Parent,但默认为someFunction for Child。
如何仅为Child实例更改loadPage方法的默认值?或者我错了吗?我觉得我可能会忽略一个更好的解决方案。
class Parent():
def __init__(self):
# statement...
# statement...
def loadPage(self, pageTitle, customFunc=None):
# statement...
# statement...
# statement...
if customFunc:
customFunc()
# statement...
# statement...
class Child(Parent):
def __init__(self):
Parent.__init__(self)
self.loadPage.func_defaults = (self.someFunction) #<-- This doesn't work
答案 0 :(得分:4)
对于这些事情,我以不同的方式做到:
class Parent():
def loadPage(self, pageTitle):
# do stuff
self.customFunc()
# do other stuff
def customFunc(self):
pass
class Child(Parent):
def customFunc(self):
# do the child stuff
然后,一个Child实例会在customFunc中执行这些操作,而Parent实例会执行“标准”操作。
答案 1 :(得分:2)
尽可能少地修改您的方法:
class Parent(object):
def __init__(self):
pass
def loadPage(self, pageTitle, customFunc=None):
print 'pageTitle', pageTitle
if customFunc:
customFunc()
class Child(Parent):
def __init__(self):
Parent.__init__(self)
def loadPage(self, pagetitle, customFunc = None):
customFunc = self.someFunction if customFunc is None else customFunc
super(Child, self).loadPage(pagetitle, customFunc)
def someFunction(self):
print 'someFunction'
p = Parent()
p.loadPage('parent')
c = Child()
c.loadPage('child')
答案 2 :(得分:2)
我不会尝试使用默认值执行此操作。简单的类继承已经提供了您所需要的。
class Parent():
def __init__(self):
# statement...
# statement...
def loadPage(self, pageTitle):
# ... #
self.custom_method()
# ... #
def custom_method(self):
pass # or something suitably abstract
class Child(Parent):
def __init__(self):
Parent.__init__(self)
def custom_method(self):
# what the child should do do
答案 3 :(得分:0)
可以将customFunc()调用之前的语句导出到函数吗?和此次通话后的陈述相同。
如果是,那么父类将只调用这两个函数,子类将在它们之间调用customFunc()。 所以只有电话会被重复。
我可能会忽略一个更好的解决方案。
答案 4 :(得分:0)
嗯,最好的可能是依赖于内部属性,所以你会有这样的东西:
class Parent(object):
def __init__(self):
self._custom_func = None
def load_page(self, page_title):
if self._custom_func:
self._custom_func()
class Child(Parent):
def __init__(self):
super(Parent, self).__init__()
self._load_page = some_function