
[code]

    class name1(object):
    
        def method1(self):
    
           def method2():
               print 'Hi!'
    
           method2()
    
    class name2(name1):
    
        method2のprint 'Hi'をprint 'Hello'にする記述
    
[/code]

どのように書けばよいかご指南ください。


CC BY-SA 3.0
2016-04-25T07:54:01.687
24329
2016-04-26T00:38:46.513
10111
question
python
pythonでネストされた関数をもったクラスを継承した際のオーバーライドの仕方


以下の様になりますが、見ての通りの有様ですのでお勧めはしません。

**replace_inner_func.py**

[code]

    import new
    
    class name1(object):
      def method1(self):
         def method2():
           print 'Hi!'
         method2()
    
    class name2(name1):
      def __init__(self):
        def method2():
          print 'Hello!'
    
        m1 = self.method1
        m1_code = m1.func_code
        new_method = (None, method2.func_code)
        self.method1 = new.instancemethod(
          new.function(
            new.code(
              m1_code.co_argcount, m1_code.co_nlocals, m1_code.co_stacksize,
              m1_code.co_flags, m1_code.co_code, new_method, m1_code.co_names,
              m1_code.co_varnames, m1_code.co_filename, m1_code.co_name,
              m1_code.co_firstlineno, m1_code.co_lnotab),
            globals()),
          self, self.__class__)
    
    if __name__ == '__main__':
      n1 = name1()
      n2 = name2()
      n1.method1()
      n2.method1()
    
[/code]


CC BY-SA 3.0
2016-04-25T18:51:56.283
24341
2016-04-25T18:51:56.283
24329
answer


`method1` 自体を再実装してください。

`method2` は `method1`
のコードの一部なので、「クラスを継承して、親クラスの関数のコードを数行だけ書き換えたい」のであれば、「親クラスの関数全部を再実装する」必要があります。

「親クラスの関数」がサブクラスで再利用できそうなコードを持ってしまっているのであれば、複数のメソッドやモジュールグローバルな関数に分割して、それを再利用することを検討してください。
[Flat is better then nested.](https://www.python.org/dev/peps/pep-0020/) です。


CC BY-SA 3.0
2016-04-26T00:38:46.513
24344
2016-04-26T00:38:46.513
806
24329
answer