在Python中继承子方法

在Python中继承子方法,python,inheritance,methods,Python,Inheritance,Methods,我想在python中继承一个方法的“submethod”。有人能帮我弄清楚怎么做吗 我想做的示例: class A(object): def method(self, val): def submethod(): return "Submethod action" if not val: return submethod() return "Method action" a = A(

我想在python中继承一个方法的“submethod”。有人能帮我弄清楚怎么做吗

我想做的示例:

 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**
亲切问候,

昆汀

您不能“继承”
子方法
,因为它是
方法
的本地方法,甚至在运行
方法
之前都不存在

为什么不简单地将其作为
a
B
的顶级方法?

这称为闭包(函数中的函数),其行为与您所要求的并不完全相同。因为函数与类不同,它们没有“实例”的概念,因此函数内部的任何对象都不能从外部访问,除非它们被函数
返回

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

这将是一个更好的模式:

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

    def submethod():
        return "Submethod action"

您可以访问闭包的内部状态,但这与您所考虑的属性样式访问不同。最好在完全理解Python的名称空间和其他东西以及垃圾邮件的工作原理之前避免使用它们。

如果没有技巧,就无法做到这一点。为什么不在类级别将其定义为常规方法呢?它不一定会消失——这是一个闭包,也是Python中的一个常见习惯用法。如果返回的函数不只是立即调用,而是作为变量保存在调用者中,那么它就可以被调用并反复使用。@PaulMcGuire:Point take。我说的是具体的代码,而不是一般的代码。我会把失踪的评论删掉事实上我不能。。。基类不是我的,所以我不允许更改方法谢谢你的解释!我认为这个模式更好,但我不允许改变这个…你认为在这种情况下使用闭包有好处吗?不,在这种情况下没有。研究一下它们,看看它们是否是你将来可能考虑的东西是值得的。顺便说一句,如果不允许更改该方法,则可以对基类进行子类化,并在子类中重载该方法。:)