Для других, которые Google искали эту проблему и наткнулись на этот поток, как я это сделал ...
Попробуйте: -Xlint: -deprecation
Кажется, что работает на JDK 6 ... не уверен в других.
Java использует анонимные классы главным образом для подражания закрытиям или просто блокам кода. С тех пор в Python можно легко раздать методы нет никакой потребности в конструкции, столь же неуклюжей как анонимные внутренние классы:
def printStuff():
print "hello"
def doit(what):
what()
doit(printStuff)
Редактирование: я знаю, что это не то, что необходимо в этом особом случае. Я просто описал наиболее распространенное решение для Python проблемы обычно анонимными внутренними классами в Java.
Ну, классы являются объектами первого класса, таким образом, можно создать их в методах, если Вы хотите. например,
from optparse import OptionParser
def make_custom_op(i):
class MyOP(OptionParser):
def exit(self):
print 'custom exit called', i
return MyOP
custom_op_class = make_custom_op(3)
custom_op = custom_op_class()
custom_op.exit() # prints 'custom exit called 3'
dir(custom_op) # shows all the regular attributes of an OptionParser
, Но, действительно, почему не только определяют класс на нормальном уровне? Если необходимо настроить его, вставьте удовлетворение требованиям заказчика как аргументы __init__
.
(редактирование: фиксированные опечатки в коде)
Можно выполнить это тремя способами:
Пример опции 3 (отредактированный для удаления использования "нового" модуля - Это удерживается от использования, я не знал):
import types
class someclass(object):
val = "Value"
def some_method(self):
print self.val
def some_method_upper(self):
print self.val.upper()
obj = someclass()
obj.some_method()
obj.some_method = types.MethodType(some_method_upper, obj)
obj.some_method()
Python, вероятно, имеет лучшие способы решить Вашу проблему. Если Вы могли бы предоставить больше определенную подробную информацию того, что Вы хотите сделать это, помог бы.
, Например, если необходимо изменить метод, называемый в отдельном моменте в коде, можно сделать это путем передачи функции в качестве параметра (функции являются объектами первого класса в Python, можно передать их функциям, и т.д.). Можно также создать анонимный lambda
функции (но они ограничиваются отдельным выражением).
кроме того, так как Python является очень динамичным, можно изменить методы объекта после того, как он был создан object.method1 = alternative_impl1
, хотя это на самом деле немного более сложно, см. ответ gnud
В Python у Вас есть анонимные функции, объявленные использованием оператора лямбды. Мне не нравятся они очень - они не таким образом читаемы, и имеют ограниченную функциональность.
Однако то, о чем Вы говорите, может быть реализовано в Python с совершенно другим подходом:
class a(object):
def meth_a(self):
print "a"
def meth_b(obj):
print "b"
b = a()
b.__class__.meth_a = meth_b
Python не поддерживает это непосредственно (анонимные классы), но из-за его краткого синтаксиса это не действительно необходимо:
class MyOptionParser(OptionParser):
def exit(self, status=0, msg=None):
# body of method
p = MyOptionParser()
Единственный недостаток - Вы, добавляют MyOptionParser к Вашему пространству имен, но как John Fouhy, на которого указывают, можно скрыть ту внутреннюю часть функция, если Вы собираетесь сделать это многократно.