如何在Python中更改方法默认值?

时间:2011-08-17 21:58:17

标签: python defaults template-method-pattern

我正在构建一个继承自另一个类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

5 个答案:

答案 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