【问题标题】:How to Convert Java to Python using anonymous object function and overriding a method [duplicate]如何使用匿名对象函数和覆盖方法将 Java 转换为 Python [重复]
【发布时间】:2015-03-27 23:30:57
【问题描述】:

还有其他类似的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

附:这将在 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:

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

【问题讨论】:

    标签: java python jython


    【解决方案1】:

    如果您想覆盖/修补 特定对象 的方法(而不是在类级别,如 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"
    

    【讨论】:

    • 我想这就是我要找的。但是你能不能修改 def patch 让它也接受参数(在我的例子中它是 arg 'x')。我只是对 Python 还不太熟悉。谢谢。
    • 在我的代码中实现这个,我在尝试这个之后才发现 Someclass 实际上是一个“抽象”类。它在行中给了我一个错误“TypeError:无法实例化抽象类”:obj = Someclass("hello");你知道如何解决这个问题吗?
    • 您需要创建一个命名子类或匿名子类,如this question中所述
    • 我会接受这个答案,因为我没有在我的问题中指定导入类实际上是一个抽象类。通过在我的控制台中纯粹运行它,它产生了所需的结果,而没有我刚刚添加的 super 部分使用 def patch(self, x): print "goodbye" super(Someclass, self).do(x) # 添加
    【解决方案2】:

    如果我理解正确的话,你有一个带有方法的类,你需要重写一个函数,而不是继承这个类并重写它。 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()
    

    【讨论】:

    • def中的super怎么调用?
    • 我的 Java 有点生疏了,但我假设您想要 super 只是因为您认为 @override 为您创建了一个继承 SomeClass 的新类,并覆盖了该方法。但实际上,您想要做的只是调用现有函数对吗?我已经更新了我的答案。希望这会有所帮助
    • 如果你确实需要超一些 SomeClass 继承自的实际基类,你所需要的只是类名和 self 对象,无论如何你都可以访问它们,newFoo("self"
    • 嘿,你知道吗。我爱你!!特别是您的代码 oldfoo(self) 行。我在互联网上搜索了一堆关于使用 super 的代码,他们所说的只是 super(SomeClass, self).themethod(somearg)。甚至有人说要根据继承的类来改变 SomeClass 。但在我所有的尝试中,我总是在被覆盖的函数中得到一个无限循环。我尝试将 super(SomeClass,self) 更改为 super(BaseClass,eslf),甚至是 super(BaserClass, self),但它们仍然循环!非常感谢兄弟!它不再循环了! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多