还有其他类似于此的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)
答案 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是解决问题的一种方法。
您的代码可能有所不同,但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()