在Python中继承子类方法

3
我可以帮助您翻译以下内容,涉及IT技术方面的问题。

我想要在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
你不能这样做(没有技巧的话)。为什么不在类级别上将其定义为常规方法呢? - Lukáš Lalinský
2个回答

4

由于submethod是局部变量,只有在运行method时才存在,因此无法“继承”它。

为什么不将其作为AB的顶级方法呢?


1
它不一定会消失 - 这是一个闭包,并且在Python中是一个常见习语。如果返回的函数不仅仅是立即调用,而是保存为调用者中的变量,则可以反复调用和使用。 - PaulMcG
@PaulMcGuire:收到。我说的是具体的代码,而不是一般情况。我将把关于消失的评论删除。 - NPE
事实上,我不能... 基类不是我的,所以我不允许更改该方法。 - QGerome

2

这被称为闭包(函数内的函数),并且不完全像您所要求的那样工作。因为函数不像类那样具有“实例”的概念,因此函数内部的任何对象都不可外部访问,除非它们被函数return

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

以下是更好的模式:

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

    def submethod():
        return "Submethod action"

你可以访问闭包的内部状态,但这并不是你想要的属性式访问。在完全理解Python命名空间和相关内容之前最好避免使用它们。


谢谢您的解释!我认为这种模式更好,但是我不被允许更改它... - QGerome
你认为在这种情况下使用闭包有优势吗? - QGerome
在这种情况下是没有的。值得你去学习一下它们,看看它们是否是你未来考虑的东西。 :) 顺便说一句,如果你不允许更改方法,你可以子类化基类并在子类中重载该方法。 :) - jathanism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接