Как изменить метод по умолчанию в Python? - PullRequest
3 голосов
/ 18 августа 2011

Я строю класс Child, который наследуется от другого класса, Parent. Родительский класс имеет метод loadPage, который будет использовать дочерний объект, за исключением того, что дочерний класс должен будет выполнить свой собственный код в конце функции loadPage, но перед последними инструкциями функции. Мне нужно как-то вставить эту функцию в loadPage только для экземпляров Child, а не Parent. Я думал о том, чтобы поместить параметр customFunc в loadPage и установить для него значение по умолчанию None для Parent, но по умолчанию установить значение someFunction for Child.

Как изменить значения по умолчанию для метода loadPage только для экземпляров Child? Или я об этом не так? Я чувствую, что могу не заметить лучшего решения.

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 ]

4 голосов
/ 18 августа 2011

Для таких вещей я делаю это по-другому:

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 будет делать "стандартные" вещи.

2 голосов
/ 18 августа 2011

Я бы не стал делать это с настройками по умолчанию. Простое наследование классов уже обеспечивает то, что вам нужно.

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
2 голосов
/ 18 августа 2011

Изменение вашего метода как можно меньше:

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')
0 голосов
/ 18 августа 2011

Что ж, лучше всего полагаться на внутренний атрибут, поэтому у вас будет что-то вроде этого:

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
0 голосов
/ 18 августа 2011

Можно ли экспортировать операторы перед вызовом customFunc () в функцию? и то же самое для заявлений после этого звонка.

Если да, то родительский класс просто вызовет эти две функции, а дочерний класс будет иметь вызов customFunc () между ними. Таким образом, будут дублироваться только звонки.

Возможно, я пропускаю лучшее решение.

...