2013-12-01 4 views
0

Возможно ли частично переопределить метод? Что я имею в виду, например, у меня есть один метод, и я хочу обновить его с некоторыми изменениями, но я не хочу изменять весь метод (я не мог понять, как обновить старый метод, наследуя его, но не полностью меняя его). Итак, можно сделать что-то вроде этого:Python - метод частично переопределения

class A(object): 
    def test(self, num): 
     tmp = 3 
     res = tmp + num 
     print 
     return res 

a = A() 
a.test(5) 
returns 8 

class B(A): 
    def test(self, num): 
     tmp = 5 
     a = super(B, self).test(num) 
     return a 

b = B() 
b.test(5) 
returns 10 

Есть ли способ, чтобы обновить только tmp значение, в результате чего Рез = TMP + Num, поэтому он будет использовать его, как это определено в A классе. Или, если я хочу так обновляться, есть только способ переписать все в этом методе (потому что, используя super, я получаю только конечное значение, возвращаемое методом)?

Как предложил мне обновить вопрос с методом я пытаюсь лишь частично обновить:

def _display_address(self, cr, uid, address, without_company=False, context=None): 

     ''' 
     The purpose of this function is to build and return an address formatted accordingly to the 
     standards of the country where it belongs. 

     :param address: browse record of the res.partner to format 
     :returns: the address formatted in a display that fit its country habits (or the default ones 
      if not country is specified) 
     :rtype: string 
     ''' 

     # get the information that will be injected into the display format 
     # get the address format 
     address_format = address.country_id and address.country_id.address_format or \ 
       "%(street)s\n%(street2)s\n%(city)s %(state_code)s %(zip)s\n%(country_name)s" 
     args = { 
      'state_code': address.state_id and address.state_id.code or '', 
      'state_name': address.state_id and address.state_id.name or '', 
      'country_code': address.country_id and address.country_id.code or '', 
      'country_name': address.country_id and address.country_id.name or '', 
      'company_name': address.parent_id and address.parent_id.name or '', 
     } 
     for field in self._address_fields(cr, uid, context=context): 
      args[field] = getattr(address, field) or '' 
     if without_company: 
      args['company_name'] = '' 
     elif address.parent_id: 
      address_format = '%(company_name)s\n' + address_format 
     return address_format % args 

Так что для этого метода мне нужно только обновить/изменить address_format и args, вставляя дополнительные значения.

+0

Вы можете сделать 'tmp' параметром исходной функции' test', я думаю, что это был бы самый простой способ. – rlms

+0

Да, это было бы легко, но дело в реальном коде, я не могу этого сделать, поскольку я не могу изменить старый метод, я могу только обновить его через наследование. Поэтому я полагаю, что мне нужно переписать весь метод. – Andrius

+0

Каков реальный метод? В некоторых случаях вы можете сделать это с помощью декораторов. – rlms

ответ

2

С tmp является локальной переменной Atest функции, нет (переносного) способа доступа к ней. Либо сделайте tmp еще один параметр test, и просто перейдите в соответствующее значение (возможно с подходящим значением по умолчанию, если ни один не передан), или сделайте поле A и переопределите это значение поля в B.

Редактировать: Увидеть фактический код и узнать, что вы не можете изменить его, делает это намного сложнее. В принципе, вам придется скопировать-вставить код суперкласса и просто изменить необходимые детали. Хорошие решения требуют модификации метода суперкласса.

Смежные вопросы