【问题标题】:Python Inheritance with closures带有闭包的 Python 继承
【发布时间】:2014-06-10 17:07:43
【问题描述】:

如果我必须从B类中的A类重写或继承function2,我该如何完成这种继承?

class A(object):
    def function1(self, x, y):
        def function2(y):
            print "Function 2 ", y
        print "Function 1 ", x
        function2(y)

class B(A):
    def function1(self, x, y):
        def function2(y):
            print "Before function2"
            # Execute class A function2
            print "After function2"
        # do anything
        return super(B,self).function1(x,y)

a = A()
a.function1(10,6)

b = B()
b.function1(11,7)

【问题讨论】:

  • 没有“class A function2”。这是A 类中的方法function1 的本地方法,如果您不以某种方式将其外部化,我看不到访问它的方法。不过,我可能会监督一些事情。

标签: python class inheritance closures overriding


【解决方案1】:

function2 不属于类A - 它是方法function1 的本地对象。因此,您不能覆盖或继承function2。如果如您的示例所示,function1 没有返回对function2 的引用,那么您将无法直接访问它,因为它实际上并不存在,除非function1 正在运行。您可以访问它的唯一方法是按照您已经完成的方式 - 调用 super(B,self).function1

但是,如果function1 返回对function2 的引用,那么您可以随意使用它。例如:

class A(object):
    def function1(self, x, y):
        def function2(y):
            print "Function 2 ", y
        print "Function 1 ", x
        return function2

通过调用super(B,self).function1(x,y),您将返回对function2 的引用,您可以随意使用它。


让我们看看为什么谈论覆盖或继承function2 没有意义。如果function1 是这样定义的:

def function1(self, x, y):
    function2 = lambda y: doSomethingWithY(y)
    localVar = 'a local variable'

在这种情况下,function2 显然是一个局部变量,localVar 也是如此。定义函数的 lambda 语法比使用 def <functionname>: 更严格,但结果是一样的 - 创建一个函数并将其分配给一个局部变量。谈论继承或覆盖localVar 和谈论function2 一样有意义。

真的,你应该担心function1。它基于xy 执行一些任务,这就是您需要关注的行为。需要担心函数究竟如何完成其​​任务通常是一个非常糟糕的主意。如上所示,该功能等效于:

def function1(self, x, y):
    print 'Function 1 ', x
    print 'Function 2 ', y

如果您可以使用该方法,那么就这样做。如果没有,请不要使用它。如果您想掩盖该行为以便发生其他事情,请覆盖该方法(如果您可以使用它来帮助您完成新行为,可以选择调用super(B,self).function1)。

【讨论】:

  • 所以没有办法通过继承来修改 function2 的行为,因为它属于 funtion1 而不是 A 类。如果我需要修改它的行为,我必须在 B 类中完全覆盖 function1 或创建一个新方法。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2016-05-12
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多