【问题标题】:Inherit a sub method in Python在 Python 中继承子方法
【发布时间】:2012-01-11 13:42:11
【问题描述】:

我想继承 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**

亲切的问候,

昆汀

【问题讨论】:

  • 你不能这样做(没有技巧)。为什么不在类级别将其定义为常规方法?

标签: python inheritance methods


【解决方案1】:

您不能“继承”submethod,因为它是 method 本地的,并且在运行 method 之前甚至不存在。

为什么不简单地将其设为AB 的顶级方法?

【讨论】:

  • 它不会必然消失 - 这是一个闭包,也是 Python 中的一个常见习语。如果返回的函数不是立即被调用,而是作为变量保存在调用者中,那么它可以被一次又一次地调用和使用。
  • @PaulMcGuire:要点。我在谈论特定的代码而不是一般的代码。我会编辑消失的备注。
  • 其实我不能...基类不是我的,所以我不允许更改方法
【解决方案2】:

这称为闭包(函数中的函数),其行为与您所要求的不太一样。因为函数不像类,它们没有“实例”的概念,因此函数内部的任何对象都不能被外部访问,除非它们被函数returned。

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

这将是一个更好的模式:

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

    def submethod():
        return "Submethod action"

您可以访问闭包的内部状态,但这与您正在考虑的属性样式访问不同。在你完全理解 Python 的命名空间、东西和垃圾是如何工作的之前,最好避免使用它们。

【讨论】:

  • 感谢您的解释!我认为这种模式更好,但我不允许改变它......
  • 你认为在这种情况下使用闭包有优势吗?
  • 不,在这种情况下没有。值得您花时间研究它们,看看它们是否是您将来可能考虑的东西。 :) 顺便说一句,如果不允许更改方法,则可以子类化基类并在子类中重载方法。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2011-08-03
相关资源
最近更新 更多