3

我正在构建一个继承自另一个类 Parent 的类 Child。Parent 类有一个 Child 将使用的 loadPage 方法,但 Child 需要在接近 loadPage 函数的末尾但在函数的最终语句之前运行自己的代码。我需要以某种方式将此函数插入​​到 loadPage 中,仅用于子实例,而不是父实例。我正在考虑将 customFunc 参数放入 loadPage 并将其默认为 None 对于 Parent,但对于 Child 默认为 someFunction。

如何仅为 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
4

5 回答 5

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

然后,子实例将执行 customFunc 中的内容,而父实例将执行“标准”内容。

于 2011-08-17T22:02:30.547 回答
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')
于 2011-08-17T22:07:15.127 回答
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
于 2011-08-17T22:08:05.133 回答
0

可以将 customFunc() 调用之前的语句导出到函数吗?与此调用后的语句相同。

如果是,那么父类将只调用这两个函数,而子类将在它们之间调用 customFunc()。所以只有调用会被复制。

我可能忽略了一个更好的解决方案。

于 2011-08-17T22:03:04.460 回答
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
于 2011-08-17T22:04:45.953 回答