如何使用匿名对象函数将Java转换为Python并重写方法

时间:2015-03-27 10:22:18

标签: java python jython

还有其他类似于此的stackoverflow questions,但并不特定于我需要覆盖函数的问题。

我想将以下Java代码转换为Python:

import Someclass;

Someclass obj = new Someclass("stringarg") {
    @Override
    void do(x) {
      // Do extra stuff on function
      super.do(x);
    }
}

我是否需要为此明确创建一个虚拟类?可以像在这个Java代码中一样在单个语句中将它转换为Python吗?

使用:Python 2.7.6,Java 1.8

P.S。这是在Jython中完成的,其中Someclass是导入的Java库。

任何帮助将不胜感激。感谢。

UDPATE:

  • 对于那些与我有相同问题的人,但导入类是一个抽象类:

感谢DNA的link,我设法通过在他的方法中添加一个超级语句来实现它,如下所示:

    def patch(self, x):
       # do something
       print 'goodbye'
       super(Someclass, self).do(x)

    obj = type('DummySomeclass', (Someclass, object), {"do": patch})("hello")
  • 对于那些导入类不抽象的人来说,DNA和algrebe的代码已经可以运行,但也只是添加了缺失的超级代码:

    ...
    super(Someclass, self).do(x)
    

2 个答案:

答案 0 :(得分:2)

如果要覆盖/修补特定对象的方法(而不是在类级别,如algrebe的回答中所述),您可以这样做,但是您需要注意该方法已正确绑定,如this article

中所述

这是一个可运行的例子:

import types

class Someclass():

  def __init__(self, x):
    self.x = x

  def do(self):
    print self.x

if __name__ == "__main__":

  def patch(self):
    print "goodbye"

  obj = Someclass("hello")
  obj.do  = types.MethodType(patch, obj)

  obj.do()    # prints "goodbye"

答案 1 :(得分:1)

如果我理解正确,你有一个带有方法的类,你需要覆盖一个函数,而不继承这个类并重写它。 Monkey Patching是解决问题的一种方法。

根据Jython Concurrency

  

您的代码可能有所不同,但Python为您提供了避免远程操作的好工具。您可以使用闭包,装饰器,甚至有时选择猴子修补模块。利用Python是一种动态语言的事实,对元编程有很强的支持,并且记住Jython实现在使用顽固的Java代码时可以访问这些技术。

class SomeClass(object):
    def __init__(self):
        self.a = "a"

    def foo(self):
        print "Base Foo"

    def bar(self):
        print "Base bar"
# new foo should execute something and then call the existing one
# i take it this is why you needed "super"
oldfoo = SomeClass.foo
def newFoo(self, name="default name"):
    print "Overridden %s" % name
    oldfoo(self)

# completely replace bar
def newBar(self):
    print "Overridden bar"

SomeClass.foo = newFoo
SomeClass.bar = newBar

obj = SomeClass()
obj.foo()
obj.bar()