2011-12-02 99 views
3

我想在Python中继承一个方法的子方法。有人能帮我弄清楚如何做到这一点吗?继承Python中的子方法

的是我想要做的

例子:

class A(object): 
    def method(self, val): 
     def submethod(): 
      return "Submethod action" 
     if not val: 
      return submethod() 
     return "Method action" 


a = A() 

class B(A): 
    def method(self, val): 
     #inherit submethod ?   
     def submethod(): 
      return "Another submethod action" 

     return super(B,self).method(val) 

b = B() 
print "A : " 
print a.method(True) 
>> Method action 
print a.method(False) 
>> Submethod action 
print "B : " 
print b.method(True) 
>> Method Action 
print b.method(False) 
Actual answer : 
>> Submethod Action 
**Wanted answer : 
>> Another submethod action** 

亲切的问候,

昆汀

+1

你不能这样做(没有技巧)。为什么不把它定义为在课堂上的常规方法? –

回答

2

这被称为闭包(函数内的函数),并不像你问的那样。因为函数不像类,所以它们没有“实例”的概念,因此函数内部的任何对象都不能从外部访问,除非它们是由函数编写的。

注意,在Python方法本质上是绑定到一个类的函数。

这将是一个更好的模式:

class A(object): 
    def method(self, val): 
     if not val: 
      return self.submethod() 
     return "Method action" 

    def submethod(): 
     return "Submethod action" 

您可以访问关闭的内部状态,但它是不一样的属性的方式来访问你的想法。除非你完全理解Python的命名空间和东西以及垃圾是如何工作的,否则最好避免它们。

+0

谢谢你的解释!我认为这种模式更好,但我不允许改变这种... – QGerome

+0

你认为在这种情况下使用闭包有一个优势吗? – QGerome

+0

不,在这种情况下没有。这是值得你花一些时间来研究它们,看看它们是否是你将来可能考虑的事情。 :)顺便说一句,如果你不允许改变方法,你可以继承基类并重载子类中的方法。 :) – jathanism

4

你不能“继承” submethod因为它是本地method和甚至不存在直到method运行。

为什么不简单地使它成为AB的顶级方法?

+1

它不一定*消失 - 这是一个闭包,是Python中常见的习惯用法。如果返回的函数不是立即调用,而是作为变量保存在调用者中,则可以调用并反复使用它。 – PaulMcG

+0

@PaulMcGuire:取点。我是在谈论特定的代码而不是一般的。我会编辑失踪标记。 – NPE

+0

事实上,我不能...基类不是我的,所以我不允许改变方法 – QGerome